最近我从5.5.8将MySQL版本更改为5.6.23并遇到了一些查询性能问题。在旧MySQL;查询是在一段合理的时间内执行的,但在新的一个freebsd服务器+ 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)
所以我也检查了它,以及日期类型。现在我几乎没有任何想法尝试。如果需要,我可以提供额外的数据。
目前我正在单独执行查询(我希望在一个查询中执行此操作)保存情况。
答案 0 :(得分:1)
我的建议很少:
EXPLAIN
查询并查看创建临时表,文件排序等?尽量避免所有这些事情。WHERE
子句,请确保数据类型相同,如果列为“123”并且您要比较col1 = 123,则不使用索引。