2015-04-07 98 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,則不會使用索引。