本周末,我将数据库从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倍。它绝对不是向后兼容的,正如“分组”行为所证明的那样。
答案 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缓存。
如果您不担心每次提交后二进制日志都同步,请再次禁用它。