2011-11-08 63 views
4

我有這個mysql查詢,我不知道什麼索引查詢中的所有字段的含義。我的意思是可以索引CASE語句中的所有字段,連接語句和Where語句?索引字段是否有任何性能影響?可以索引這個mysql查詢中的所有字段嗎?

SELECT roots.id as root_id, root_words.*, 
CASE 
WHEN root_words.title LIKE '%text%' THEN 1 
WHEN root_words.unsigned_title LIKE '%normalised_text%' THEN 2 
WHEN unsigned_source LIKE '%normalised_text%' THEN 3 
WHEN roots.root LIKE '%text%' THEN 4 
END as priorities 
FROM roots INNER JOIN root_words ON roots.id=root_words.root_id 
WHERE (root_words.unsigned_title LIKE '%normalised_text%') OR (root_words.title LIKE '%text%') 
OR (unsigned_source LIKE '%normalised_text."%') OR (roots.root LIKE '%text%') ORDER by priorities 

另外,如何進一步提高查詢速度?

謝謝!

回答

5
  1. 您在表中索引列而不是查詢。

  2. 您指定的搜索條件都不能使用索引(因爲搜索條件以通配符開頭)。

  3. 您應該確保id列已編制索引,以加快JOIN的速度。 (據推測,它已經被索引爲一個表中的PRIMARY KEY和另一個表中的FOREIGN KEY)。

要加快此查詢,您將需要使用全文搜索。添加索引不會加速這個特定的查詢,並且會花費您在INSERT,UPDATE和DELETE上的時間。

2

警告:索引加速檢索時間,但會導致插入和更新運行速度變慢。

2

要回答爲每個字段建立索引的含義,每當通過插入,更新或刪除修改索引的數據時使用索引時都會出現性能問題。這是因爲SQL需要維護索引。這是數據讀取頻率與修改頻率的平衡。

在這個特定的查詢中,唯一可能幫助的索引將位於您的JOIN子句中,字段roots.idroot_words.root_id

您的WHERE子句中的任何支票都沒有索引,因爲前導'%'。這會導致SQL掃描這些表中的每一行以獲取匹配的值。

如果你能夠刪除領先的'%',那麼你將受益於這些領域的索引......如果不是,你應該考慮實施full-text search;但要警告,這不是微不足道的。

1

當與LIKE '%something%'一起使用時,索引將無濟於事。

這就像在字典中查找字詞的地方有ae。字典(或本例中的Index)是基於單詞的第一個字母,然後是第二個字母等進行組織的。它沒有任何機制將所有與ae相關的單詞放在一起。你仍然會從頭到尾閱讀整本字典。


索引CASE子句中使用可能不會幫助你的領域。通過在表格中查找記錄很容易,索引幫助您。 CASE條款是關於處理您找到的記錄,而不是首先找到它們。


優化器也可以與優化多個無關OR條件如你的糾纏。優化器試圖縮小完成查詢的工作量,但當無關的條件可以使記錄可以接受時,很難做到這一點。


總而言之您的查詢就會從索引中受益的roots(root_id)和/或roots(id),但僅此而已。

如果你要索引附加字段雖然,兩個主要的成本是:
- 增加寫入時間(插入,更新或刪除),由於額外的指標寫入
- 磁盤

上佔據上升空間
相關問題