我有一个有很多条目的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%')
除了将索引添加到外键之外,还有什么方法可以加快此查询,我已经完成了。
答案 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.*'
)
答案 2 :(得分:0)
MySQL无法使用column1
或column2
上的任何索引。如果你正在做LIKE 'Keyword1%'
,那就可以。由于MySQL无法使用索引,因此必须检查表中的每一行以查找匹配项。
在此处阅读更多内容:http://use-the-index-luke.com/sql/where-clause/searching-for-ranges/like-performance-tuning