mysql 5.7.10性能3倍慢于5.6.28

时间:2016-01-31 17:09:23

标签: mysql performance

本周末,我将数据库从5.7.10回滚到5.6.28。在具有多次写入插入的2700万条记录的测试负载中,MySQL 5.7.10花费了120分钟来加载该数据库。在同一台机器上,5.6.28用了40分钟。这是一个可重复的事件。测试是在具有64GB内存的Windows 7 Professional机器上完成的。它是在具有256 GB内存的Windows Serve 2012 R2的服务器上完成的。

这不是唯一的问题。 group by语句无法对子查询进行操作,并始终对查询内的表进行操作。 例如:

select * from (select * from tablename order by datex desc, timex desc ) as A 
group by recordx;

此查询应拉出A表的第一条记录,如5.6.28所示。在5.70.10中,查询提取从tablename和NOT A输入的最早记录。即使用asc替换desc,结果也是一样。

5.6.28总是选取子查询“A”表中的top元素。

MySQL需要一些解释才能使他们的5.7.10声称速度提高3倍。它绝对不是向后兼容的,正如“分组”行为所证明的那样。

2 个答案:

答案 0 :(得分:2)

这个答案没有解决性能问题(我认为需要更多信息,这应该是一个单独的问题。它解决了查询问题。

MySQL documentation非常清楚这个查询:

select *
from (select * from tablename order by datex desc, timex desc ) as A
group by recordx

产生不确定的结果。以下是相关引用:

  

服务器可以自由选择每个组中的任何值,因此除非他们   如果相同,选择的值是不确定。此外,   每组的值的选择不受添加的影响   一个ORDER BY条款。结果集排序发生在值之后   已选择,ORDER BY不会影响每个组中的哪些值   服务器选择。

令人遗憾的是,您的开发人员使用明确记录的代码无法正常工作。你应该修复代码。

一个解决方法是:

select * 
from tablename
where not exists (select 1
                  from tablename t2
                  where t2.recordx = t.recordx and
                        (t2.datex > t.datex or
                         t2.datex = t.datex and t2.timex > t.timex
                        )
                 );

答案 1 :(得分:0)

耐用性默认值已在5.6和5.7之间更改。 现在默认启用Sync_binlog(请参阅http://lefred.be/content/sync_binlog-1-in-5-7/

这当然会影响性能,当然如果不使用raid缓存。

如果您不担心每次提交后二进制日志都同步,请再次禁用它。