我有带有列的表格
blog_detail
- id INT PK、blog_id INT FK、语言 INT、标题 VARCHAR(255)。
博客
- id INT PK,author_id INT FK,创建日期
我在表 blog_detail
中有索引
blog_id_language
- blog_id、语言
blog_id
- blog_id
blog_id_title
- blog_id、标题
查询是:
SELECT *
FROM `blog`
LEFT JOIN `blog_detail` ON `blog`.`id` = `blog_detail`.`blog_id`
WHERE (`blog`.`is_active` = 1)
AND (( `blog`.`id` LIKE "%fulltextsearch%")
OR (`blog_detail`.`title` LIKE "%fulltextsearch%")
)
MySQL 选择使用根本未使用的列的索引 blog_id_language
。
为什么MySQL不只选择没有无用列语言的blog_id
或使用两个已用列的blog_id_title
?
最佳答案
您正在创建我认为是正常的列索引,它索引列的确切值 - 这些不能与模式匹配样式查询一起使用(例如“LIKE '%text%'”)。但是,它们将适用于开头匹配(例如“LIKE 'text%'”)。
您需要将 blog.id 和 blog_detail.title 索引更改为 FULLTEXT 类型并使用适当的 FTS(全文搜索),或者将您拥有的场景分解为多个开始匹配条件。
或者,您可以使用 lucene 之类的工具来为您建立索引和搜索。
查看此问题以获得更深入的答案:
How to speed up SELECT .. LIKE queries in MySQL on multiple columns?
关于MySQL选择错误的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53871287/