2010-01-11 43 views
29

我有一個MySQL表,爲此我非常頻繁地查詢SELECT x, y, z FROM table WHERE x LIKE '%text%' OR y LIKE '%text%' OR z LIKE '%text%'。任何種類的索引是否有助於加快速度?如何加快在多列MySQL中的SELECT .. LIKE查詢?

表中有幾百萬條記錄。如果有什麼會加快搜索速度,是否會嚴重影響數據庫文件的磁盤使用率以及INSERTDELETE語句的速度? (無UPDATE被執行過)

更新:發佈之後很快,我已經看到了很多關於LIKE在查詢中使用信息的方式和討論;我想指出,解決方案必須使用LIKE '%text%'(也就是說,我正在查找的文本是前置的並附有%通配符)。數據庫也必須是本地的,原因很多,包括安全性。

+4

想想這樣,它不是一個完美的比喻,但它表明了這一點。考慮在後面有一個詞索引的書。如果你想查找一個簡單的單詞或者甚至是以相同的前幾個字母開頭的單詞,那麼沒有問題。考慮當你想使用該書籍索引來查找包含單詞中任何地方的字母「exe」的所有單詞時會發生什麼。這個索引幾乎沒有用,你可能會閱讀真正的書來尋找這些詞。這大致是你在mySQL上施加的問題。 – JohnFx

回答

51

索引不會加快查詢速度,因爲對於文本列索引工作是通過索引從左開始的N個字符。當你使用LIKE'%text%'時,它不能使用索引,因爲在文本之前可能有可變數量的字符。

你應該做的是不使用這樣的查詢。相反,您應該使用MySQL支持的MyISAM表的FTS(全文搜索)。爲非MyISAM表製作自己的索引系統也非常容易,您只需要一個單獨的索引表,您可以在實際表格中存儲單詞及其相關ID。

+7

我應該補充說,自MySQL 5.6以來,全文搜索也可用於InnoDB。 – Sergio

+0

雖然有些情況下全文檢索是不可能的,就像表意語言一樣。 https://dev.mysql.com/doc/refman/5.7/en/fulltext-restrictions.html –

9

索引可以使用其中搜索標準與一個通配符開始加快查詢速度:

LIKE '%text%'

索引可以(並且可能,這取決於選擇性)用於搜索術語形式:

LIKE 'text%'

14

的索引將不會幫助文本匹配與一家領先的通配符,索引可以用於:

LIKE 'text%' 

但我猜測這不會削減它。對於這種類型的查詢,如果要縮放可搜索的記錄數量,您應該查看全文搜索提供程序。我的首選提供商是Sphinx,非常全功能/快速等。Lucene也許值得一看。 MyISAM表上的全文索引也可以工作,但最終追求MyISAM的任何數據庫都有大量的寫入操作並不是一個好主意。

+0

在MySQL 5.6及更高版本中,它們也可以與InnoDB表一起使用。 https://dev.mysql.com/doc/refman/5.7/en/fulltext-restrictions.html –

7

我想補充說的是,在某些情況下,如果您正在查看的字段通常爲空或包含某些常量,則可以使用索引和/ rlike一起加快查詢速度。

在這種情況下,您似乎可以通過添加固定值的「and」子句來限制使用索引訪問的行。

我嘗試過在一張通常不包含很多標籤的巨大表格中搜索「標籤」。

SELECT * FROM objects WHERE tags RLIKE("((^|,)tag(,|$))" AND tags!=''

如果您在標籤上有一個索引,你會看到它是用於限制正在搜索的行。

+0

這是一個非常好的選擇,我能夠以這種方式對列進行索引。 – Kennysmoothx

6

也許你可以嘗試升級mysql5.1到mysql5.7。

我有大約70,000條記錄。而下面的SQL運行:

select * from comics where name like '%test%'; 

這需要2000毫秒在mysql5.1。 在mysql5.7或mysql5.6中需要200ms