88
回答
OSC 第 97 期高手问答 —— MySQL 优化
注册华为云得mate10,2.9折抢先购!>>>   

OSCHINA 本期高手问答( 11月3日- 11月10日) 我们请来了 @叶金荣 为大家解答关于 MySQL 优化 方面的问题。

叶金荣(常用ID:yejr)是 MySQL 中文网(http://imysql.com)创始人,2006 年建站至今,可以算是国内最早的 MySQL 技术博客。从事过 LAMP 开发,后成为专职 MySQL DBA,现围绕运维领域发展,擅长 MySQL 优化、数据库架构设计及对比基准压测。目前仍以 MySQL DBA 自居,偶尔也会作为 Consultant,2012 年被提名成为 ORACLE ACE(MySQL),目前仍不遗余力推广 MySQL。和几位同行发起成立 ACMUG 以及中华数据库协会

MySQL 5.7 GA 版本刚刚发布不久,带来了很多新特性,本期我们邀请了 MySQL 方面的专家@叶金荣 为我们解答关于 MySQL 优化方面的问题。

欢迎关注@叶金荣 的微信公众号(MySQL中文网):imysql_wx

OSChina 高手问答一贯的风格,不欢迎任何与主题无关的讨论和喷子。

下面欢迎大家就 MySQL 方面的问题向 @叶金荣 提问,请直接回帖提问,提问的时候请描述清楚具体的场景,方便回答。

举报
叶秀兰
发帖于2年前 88回/13K+阅
共有88个答案 最后回答: 2年前
@叶金荣 : 请问每天的用户行为数据量超过1个亿,如何优化,如何统计呢?
--- 共有 5 条评论 ---
xlgosin回复 @稻草鸟人 : 离线分析,用hadoop比较合适。 2年前 回复
稻草鸟人回复 @egmkang : 什么意思??没明白 2年前 回复
egmkang回复 @稻草鸟人 : 只能求交集,别无他法 2年前 回复
稻草鸟人举个例子啊: 有个角色登陆表role_login 每天记录数过亿 需求:我现在需要知道用户的次日留存,3日留存,7日留存,14日留存,月留存,季度留存,年度留存 概念:次日留存是指昨天登陆,今天也登陆的用户,3日留存是3前天登陆,今天登陆的用户....其他同理 问: 像这样的,似乎简单做个索引效果并不会太好啊...您认为呢? 2年前 回复
叶金荣看你的sql统计,给高频的sql加上合适的索引就ok 2年前 回复

@叶金荣 :innodb还有没有数据丢失的情况了??

--- 共有 1 条评论 ---
Ambitor5.7之后,binglog的写默认变成同步了~,要丢只会丢一个事务~,不过mysql重启后会把这个没完成的事务 回滚~所以不会丢数据 1年前 回复
@叶金荣 :  叶神,实现批量insert数据的时候,常用的都是通过batchUpdate方法,在一个事务里把很多单条insert into ..values(); 这样的语句插入到数据库中。还有一种就是insert into ..values(),(),...,();这种方式,一条SQL实现批量插入。有没有明确的原理性解释,哪种方式更优呢?另外,这种多values方式insert,为啥出现的很少?是不是自从有sql的时候,就能这样玩的?
--- 共有 5 条评论 ---
zigzagroad应该和事务大小对其他方面的影响来说的吧,这应该是一个综合权衡的值 2年前 回复
未曾去过的地方@zigzagroad 8错,不过这个1000的数量,是否跟表结构,列大小等有关?如果表字段少,可以大点,表字段多,可能要少点。 2年前 回复
zigzagroad多条insert的话,SQL语句要解析多次;一个insert带多个value的话 就只解析一次SQL。 2年前 回复
egmkang回复 @zigzagroad : insert多条和多条insert实际上区别不是特别大,如果真的是BatchUpdate,正确的做法是BEGIN/COMMIT,中间放多条insert语句,这样会把多个事务变成一个事务. 2年前 回复
zigzagroad这是数据库优化了SQL语句的解析工作(一次解析)和批量插入、整体性地事务提交;单个insert语句的话 每条SQL都要做SQL解析和开启事务、插入数据、提交事务,这自然就比批量操作慢了。知道SQL语句交由MySQL处理后的内部工作过程和原理就不难知道其区别了。 2年前 回复
@叶金荣 :近在做一个项目,本人DBA新手,遇到一个问题。问题具体是这样的:有一个历史记录表是记录车辆上的相关信息,同一时间会有很多车辆的数据需要插入这个表,表内用车牌来区别各个车辆,所以会有大量的table,每个table对应一个车,里面的信息是历史信息,所以量会很大。现在打算按时间段来划分,比如收集好半天的车辆信息数据一次性往历史表内插,我试了下insert循环插5000条数据(一条数据有50列)和addBatch()也要13秒,感觉插入效率比较低,有没有好的方案呢?我在网上看过说多线程并行插入,但是我对这个不太懂,我现在是java+mysql
--- 共有 8 条评论 ---
w4920@zigzagroad 应该说是不超过1024 2年前 回复
w4920@zigzagroad 长度不超过64个字符,每条记录写入后会以BLOB形式显示,不会自动删除 2年前 回复
zigzagroad字符串类型的字段长度1KB,数据表字段设置长度是多少?1024?8192?<br/> 我们有设置到12000长度的字符串字段,不过每条数据在使用后会被自动删除的。 2年前 回复
w4920@zigzagroad 其中有一列是二进制字符串,很大,差不多1KB一条二进制字符串 2年前 回复
zigzagroad50列不算多的 2年前 回复
@叶金荣 :做复杂的统计分析,写一个复杂的sql好还是在java里面利用多个sql再在java里面统计分析好?
--- 共有 1 条评论 ---
Fanxme以前做个类似的, 在Java里动态组装SQL, 建立一个创建存储过程的语句, 然后执行创建语句, 立即调用 2年前 回复

@叶金荣 :  使用 mybatis处理数据批量insert 和 update的时候,其实就是把  多个insert或update 语句使用 ;分隔一次发送50多条语句, 还有其他可以优化的办法吗?

批量方式如下

insert  ; insert;

update;update;


--- 共有 2 条评论 ---
egmkangBEGIN; insert ; insert; update;update; COMMIT; 2年前 回复
zigzagroad如果插入的是相同表的数据,可以 insert…values(…), (…), (…); 的方式。 2年前 回复
顶部