MySQL选择错误的索引

时间:2018-12-20 15:09:42

标签: mysql indexing

我有带有列的表

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

1 个答案:

答案 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?