2015-04-07 66 views
1

最近我将MySQL版本从5.5.8更改为5.6.23,并陷入了一些查询性能问题。在旧的MySQL中;查询是在一段合理的时间内执行的,但是在新的一个freebsd服务器+ mysql服务器变得没有响应。 Linux命令Mysql查询/服务器优化

[Linux的〜]顶

节目的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) 

所以我也检查过,并且日期类型也。现在我几乎没有任何想法去尝试。如有需要,我可以提供其他数据。

目前我正在节省单独执行查询(我希望在一个查询中执行查询)的情况。

回答

1

我有几个建议:通过创建子查询不能使用索引

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