我有带有列的表
blog_detail
-id INT PK, blog_id INT FK, language INT, title VARCHAR(255).
blog
-id INT PK, author_id INT FK, created DATETIME
我在表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
?
答案 0 :(得分:1)
您正在创建我认为是普通列索引的索引,它们索引列的确切值-这些不能与模式匹配样式查询(例如“ LIKE'%text%'”)一起使用。但是,它们将适用于开始匹配(例如“像'text%'”之类的)。
您要么需要将blog.id和blog_detail.title索引更改为FULLTEXT类型,并使用适当的FTS(全文搜索),要么将您遇到的情况分解为多个开头匹配条件。
或者,您可以使用lucene之类的方法来建立索引并搜索您。
查看此问题以获取更深入的答案:
How to speed up SELECT .. LIKE queries in MySQL on multiple columns?