我在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行,这不是很多。我发现的文档是对字符串的索引不适用于通配符。是否有可以使用的替代策略?
答案 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'