MySQL选择错误的索引

标签 mysql indexing

我有带有列的表格

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/

相关文章:

c# - "Could Not load file or assembly"天蓝色网络应用程序

python - "index"属性 - Python

MySQL - 为什么在这种情况下二级索引不会减少此查询的时间?

android - 如何在 Android Room 中创建部分索引

mysql - 如何在不丢失全文索引的情况下连接表?

mysql - SQL:如果为 NULL 值,则将列值向左移动

mysql - 如何使用MySQL数据库创建角色

mysql - 如何获得最后一个 X 值的平均值?

mysql - 索引查询 "WHERE a IN (1,2,3) AND b = 4"

python - 使用 NumPy 数组索引列表时出现 TypeError : only integer scalar arrays can be converted to a scalar index