簡體   English   中英

MySQL查詢/服務器優化

[英]Mysql query/server optimization

最近,我將MySQL版本從5.5.8更改為5.6.23,並陷入了一些查詢性能問題。 在舊的MySQL中; 查詢是在合理的時間內執行的,但是在新的一台freebsd服務器中,mysql服務器變得無響應。 Linux命令

[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

目前,我正在使用索引和內存中表的緩存。 歡迎任何速度優化或其他建議。

我搜索網,發現了一些很好的來源來源1源2和許多其他人,我已經在現有的查詢中使用。 我還檢查了比較的字符串類型。 根據經驗,選擇以下行時會遇到一些問題:

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

所以我也檢查了一下,日期類型也是如此。 現在我幾乎沒有更多嘗試的想法了。 如果需要,我可以提供其他數據。

目前,我通過單獨執行查詢來節省情況(我希望在一個查詢中這樣做)。

我的建議很少:

  • 子查詢創建的表不能使用索引,並且您正在使用2-3個子查詢。 壞習慣! 如果使用大型表,則創建臨時表可能會很有效。
  • 你做EXPLAIN查詢,看看創建臨時表,文件排序等? 盡量避免所有這些事情。
  • 關於WHERE子句,請確保數據類型相同,如果列為“ 123”,並且您正在比較col1 = 123,則不會使用索引。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM