Mysql查询/服务器优化

时间:2015-04-07 10:08:11

标签: php mysql sql-server

最近我从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

目前我在内存中使用索引和表的缓存。 欢迎任何速度优化或其他建议。

我搜索了网络,发现了一些很好的来源source1source2以及我已经在现有查询中使用过的许多其他来源。我还检查了我比较的字符串类型。根据经验,我在选择以下行时遇到一些问题:

where x.field=field (slow)
where x.field="field" (much faster)

所以我也检查了它,以及日期类型。现在我几乎没有任何想法尝试。如果需要,我可以提供额外的数据。

目前我正在单独执行查询(我希望在一个查询中执行此操作)保存情况。

1 个答案:

答案 0 :(得分:1)

我的建议很少:

  • 子查询创建的表不能使用索引,并且您使用的是2-3个子查询。糟糕的做法!!如果使用大型表,则创建临时表可能会有效。
  • 您是否查询过EXPLAIN查询并查看创建临时表,文件排序等?尽量避免所有这些事情。
  • 关于WHERE子句,请确保数据类型相同,如果列为“123”并且您要比较col1 = 123,则不使用索引。