2015-06-09 28 views
1

我有一個有很多條目的dockets表。我已經爲密鑰類型爲「MUL」的條目的外鍵添加了一個索引。但查詢仍然運行緩慢,因爲我必須檢查每行的2列以檢查它們是否包含4個關鍵字中的任何一個。這意味着我有8 NOT LIKE子句這個查詢:加快與很多像條款查詢

SELECT `entries`.* FROM `entries` 
WHERE `entries`.`docket_id` IN (1, ...) 
AND (column1 NOT LIKE '%Keyword1%' AND column2 NOT LIKE '%Keyword1%') 
AND (column1 NOT LIKE '%Keyword2%' AND column2 NOT LIKE '%Keyword2%') 
AND (column1 NOT LIKE '%Keyword3%' AND column2 NOT LIKE '%Keyword3%') 
AND (column1 NOT LIKE '%Keyword4%' AND column2 NOT LIKE '%Keyword4%') 

還有什麼我可以做這個查詢加快,除了添加索引外鍵,這點我已經做了。

+1

通配符likke鬥爭,這是MyISAM數據?可能值得添加全文索引? – exussum

+0

如果你在> 5.6你可以在innodb上添加FULLTEXT也可以。但是你真的需要所有這些嗎?也許db標準化可以幫助 – Mihai

+0

@exussum我使用的InnoDB版本是5.6。 – Donato

回答

0

安迪,這將不是使它更快。但是,這可能有助於確定NOT LIKE聲明不是減速的罪魁禍首。我沒有測試過這一點,但嘗試這樣的事情:

SELECT `entries`.* FROM `entries` 
WHERE `entries`.`docket_id` IN (1, ...) 
    AND (
    column1 NOT REGEXP '.*keyword1.*|.*keyword2.*|.*keyword3.*|.*keyword4.*' 
    AND 
    column2 NOT REGEXP '.*keyword1.*|.*keyword2.*|.*keyword3.*|.*keyword4.*' 
) 

https://dev.mysql.com/doc/refman/5.1/en/regexp.html

+0

正則表達式不會加速它。問題是mysql不能使用任何索引進行匹配,並且必須檢查每一行匹配。 –

+0

你說得對。您應該將其作爲答案發布。如果有的話,這個答案將向Donato證明,它不是減緩它的'NOT LIKE'語句。 –

1

如果你真的需要檢查的方式,創建一個關鍵詞表。只有兩列,來自條目表的ID和關鍵字。然後檢查那張桌子,除非你不需要這樣做,你可以做一個精確的匹配。