如何索引在搜索词开头只有一个通配符的文本搜索('%TERM')?

时间:2014-10-24 23:32:04

标签: mysql sql indexing

我在MySQL慢查询日志中找到了以下查询:

SELECT target_status 
FROM link_repository 
WHERE target_url LIKE CONCAT('%', 'bundle/rpi_/activity/rpi_bridge/bridge_manual.pdf')

当我在关于慢速页面加载的对话中向开发者经理指出这一点时,他说:

  来吧; concat()是一个简单的字符串连接和'%'是搜索字符串中的通配符。我知道搜索字符串不是最快的操作(这就是为什么我们有类似lucene的引擎,但这是微不足道的东西)

在link_repository中有大约18k行,这不是很多。我发现的文档是对字符串的索引不适用于通配符。是否有可以使用的替代策略?

1 个答案:

答案 0 :(得分:1)

为了让LIKE使用索引,它必须以某些东西开头。 MySQL搜索从左到右。因此,如果带有任何内容的字符串明星将执行表扫描,并且没有索引可以工作。

但是,如果您使用InnoDB表,则可以尝试使用Full-Text Index

您可以在列上添加Full-Text Index,然后您可以使用MATCH AGAINST函数找到您需要的内容,然后您可以添加RIGHT()子句,只提供以字符串结尾的结果。

CREATE FULLTEXT INDEX target_url ON target_status(target_url);

然后你可以像这样查询记录

SELECT target_status 
FROM link_repository 
WHERE MATCH ('bundle/rpi_/activity/rpi_bridge/bridge_manual.pdf') AGAINST(target_url) AND RIGHT(target_url, 49) = 'bundle/rpi_/activity/rpi_bridge/bridge_manual.pdf'