我有带列的表 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
-博客id,语言 blog_id
-博客\u id blog_id_title
-博客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
那就是使用两个列?
1条答案
按热度按时间t9eec4r01#
您创建的是我假设的普通列索引,它索引列的确切值-这些不能用于模式匹配样式查询(例如“like“%text%”)。但是,他们将开始匹配(例如“like'text%'”)。
您需要将blog.id和blog\u detail.title索引更改为fulltext类型并使用适当的fts(全文搜索),或者将您的场景分解为多个匹配条件。
或者,您可以使用类似lucene的工具来为您建立索引和搜索。
查看此问题以获得更深入的答案:
如何加速选择。。比如mysql中的多列查询?