簡體   English   中英

如何加快查詢速度?

[英]How can I speed up my query?

如何加快查詢速度? 我使用MySQL 5.1,表“時間表”有〜900 K行,而我的查詢要花費超過一分鍾的時間來運行:

SELECT doc_code, `DATE`, time2, pat_code, STATUS, 
       copiedto1, copiedto2, copiedto3, copiedto4, copiedto5
FROM SCHEDULE
WHERE 1=1
AND STATUS IN (5,6,30)
AND (doc_code="K9" OR copiedto1="K9" OR copiedto2="K9" 
     OR copiedto3="K9" OR copiedto4="K9" OR copiedto5="K9")
AND `date` BETWEEN "2010/04/11" AND "2011/04/11"
AND pat_code > 0
ORDER BY `date`, doc_code, time2

我嘗試添加不同的索引,但是我的查詢不想使用其中任何一個。 任何幫助,將不勝感激。

我會改成

SELECT s.* FROM (

  SELECT doc_code, `DATE`, time2, pat_code, STATUS, 
    copiedto1, copiedto2, copiedto3, copiedto4, copiedto5
  FROM SCHEDULE
  WHERE STATUS IN (5,6,30)
  AND `date` BETWEEN "2010/04/11" AND "2011/04/11"
  AND pat_code > 0
  ORDER BY `date`, doc_code, time2 ) s

WHERE (s.doc_code="K9" OR s.copiedto1="K9" OR s.copiedto2="K9" 
 OR s.copiedto3="K9" OR s.copiedto4="K9" OR s.copiedto5="K9")

我記得在MySQL文檔的某個深處,我讀過一些有關OR殺死索引使用的知識。
我有種感覺。
如果您首先使用所有AND進行查詢,以限制記錄數
然后使用OR進行選擇,希望您的查詢運行更快。

編輯

http://forge.mysql.com/wiki/Top10SQLPerformanceTips說:避免在索引字段上使用IN,這會降低性能。
無論如何,選擇條件太多了,查詢優化器不知道從哪里開始。
請注意,如果查詢優化器“認為”標准將使用所有字段的25-50% (我忘記了確切的百分比) ,則不會使用任何索引。

或者,您可以使用

SELECT s.* FROM (

  SELECT doc_code, `DATE`, time2, pat_code, STATUS, 
    copiedto1, copiedto2, copiedto3, copiedto4, copiedto5
  FROM SCHEDULE
  USE INDEX (someIndex,someOtherIndex)   #<<<<-------------
  WHERE STATUS IN (5,6,30)
  AND `date` BETWEEN "2010/04/11" AND "2011/04/11"
  AND pat_code > 0
  ORDER BY `date`, doc_code, time2 ) s

WHERE (s.doc_code="K9" OR s.copiedto1="K9" OR s.copiedto2="K9" 
 OR s.copiedto3="K9" OR s.copiedto4="K9" OR s.copiedto5="K9")

索引名稱或等於字段名稱的索引索引。
您可以在表的create語句中找到索引名稱,或者在explain select隨附的explain select輸出中找到索引名稱。

不過,在強制使用索引時要謹慎,在完成之前先進行測量。
並且請記住,當表中的數據更改時,現在運行快速的強制索引查詢可能會運行緩慢。

這是最佳選擇,您是否在WHERE子句中索引了所有列?

您可以嘗試通過預填充僅包含K9碼或僅包含pat_codes> 0的schedule_k9表來分階段進行查詢。

SELECT doc_code, DATE, time2, pat_code, STATUS, copiedto1, copiedto2, copiedto3, copiedto4, copiedto5
FROM SCHEDULE
AND (doc_code="K9" OR copiedto1="K9" OR copiedto2="K9" OR copiedto3="K9" OR copiedto4="K9" OR copiedto5="K9")
AND pat_code > 0
AND `date` BETWEEN "2010/04/11" AND "2011/04/11"
AND STATUS IN (5,6,30)
ORDER BY `date`, doc_code, time2

我將不得不查看表的樣本以進一步改善查詢(因為可能會有很多具有特定模式的行等)。

您可以使用其他類型的mysql數據庫。 一些具有更好的讀取速度,其他一些具有更好的寫入速度。 下面是關於MySQL數據庫類型的好文章: 這里

我建議您使用MyISAM表類型。 不幸的是,它不適用於索引。 您可以通過運行以下命令來更改表格的格式:

ALTER TABLE SCHEDUALE CHANGE TYPE=MyISAM

(日期,狀態)的綜合索引應使您的查詢更加生動。

暫無
暫無

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

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