使用很多类似的子句加快查询速度

时间:2015-06-09 20:25:56

标签: mysql

我有一个有很多条目的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%')

除了将索引添加到外键之外,还有什么方法可以加快此查询,我已经完成了。

3 个答案:

答案 0 :(得分:1)

如果您确实需要检查这种方式,请创建一个关键字表。只有两列,条目表中的id和关键字。然后查看该表,除非您不需要做喜欢,您可以进行完全匹配。

答案 1 :(得分:0)

Per Andy,这将让它更快。但是,它可能有助于确定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

答案 2 :(得分:0)

MySQL无法使用column1column2上的任何索引。如果你正在做LIKE 'Keyword1%',那就可以。由于MySQL无法使用索引,因此必须检查表中的每一行以查找匹配项。

在此处阅读更多内容:http://use-the-index-luke.com/sql/where-clause/searching-for-ranges/like-performance-tuning