最近,我将MySQL版本从5.5.8改为5.6.23,并遇到了一些查询性能问题。在旧的MySQL中,查询是在合理的时间内执行的,但是在新的server+mysql服务器中,则会变得没有响应。Linux命令
linux~ top
执行查询时显示mysql >100% wcpu。如果单独执行每个子查询,结果将在几秒钟内获取。此时,mysql和apache需要重新启动才能继续工作。
因此,我的问题是优化下一个查询:
SELECT concat_ws('##', pos.name,
( SELECT COUNT(*) FROM nalogi n
WHERE n.other_createtime >= '2015-03-01 00:00:00'
AND n.other_createtime <= '2015-03-31 23:59:59'
AND n.nalog_invalid = 'N' AND n.other_pos = pos.id ),
( SELECT COUNT(*) FROM nalogi n, posiljke_nalogi pn, posiljke p
WHERE p.other_createtime >= '2015-03-01 00:00:00'
AND p.other_createtime <= '2015-03-31 23:59:59'
AND pn.nalogid = n.id
AND pn.masterId = p.id
AND p.path_from_type = 'center'
AND n.nalog_invalid = 'N'
AND (p.path_to_type = 'pos' OR p.path_to_type = 'customer')
AND n.other_pos = pos.id )) 'entry' FROM spl_pos pos ORDER BY pos.id
目前,我正在内存中使用索引和表缓存。欢迎任何速度优化或其他建议。
我搜索了网络,找到了一些很好的资源-- source1、source2和许多其他我已经在现有查询中使用过的资源。我还检查了比较的字符串类型。根据经验,在选择以下几行时,我遇到了一些问题:
where x.field=field (slow)
where x.field="field" (much faster)
所以我也检查过了,也输入了日期。现在我几乎没有更多的想法去尝试。如果需要,我可以提供更多的数据。
目前,我正在单独执行查询来保存情况(我希望在一个查询中这样做)。
发布于 2015-04-07 02:50:28
我很少有建议:
EXPLAIN
,并看到创建了临时表、文件排序等?尽量避免那些事情。WHERE
子句,请确保数据类型相同,如果列为"123“,并且比较col1 = 123,则不会使用索引。https://stackoverflow.com/questions/29489001
复制相似问题