0

我只是开始在我的 MySQL 数据库中使用 INDEXes,我有点不确定我的想法是否会起作用。我有一个 TEXT 字段,可以存储大量文本,需要搜索,以及另一个 id INT 字段。如果我的 id_column 字段上有一个 INDEX,而我的 text_column 上有一个 FULLTEXT 索引,MySQL 是否会在查询中使用这两者,例如

SELECT * FROM notes WHERE id_column='123' AND MATCH(text_column) AGAINST(search_text)

??

其次,我有一组可以经常用于组合搜索的列。如果我在这些列中创建一个多列索引,如果使用的列在索引中从左到右一起,则索引将一直有效。但是,如果用户遗漏了一个特定的列,比如 B,并在 (A, B, C, D) 之类的索引中使用 A、B、D 进行搜索,会发生什么?

4

3 回答 3

0

对于问题 1:

是的,查询将使用两个索引。 FULLTEXT然而,索引可能有点棘手,因此最好仔细阅读有关它们的 MySQL 文档并EXPLAIN在查询中使用以确保它们正确使用索引。

对于问题 2:

如果您有一个多列索引,则该索引必须具有与要使用的查询相同的列顺序。因此,在您的示例中,不会使用索引。

EXPLAIN是一个非常强大的工具,用于了解查询如何使用索引,并且经常使用它是一个好主意(尤其是在以编程方式生成的查询上)。 http://dev.mysql.com/doc/refman/5.0/en/explain.html

于 2013-07-27T20:28:14.357 回答
0

不能保证 MySQL 会在一个查询中对同一个表使用两个索引。一般来说,没有。但有时它会激活“索引合并”,即搜索两个索引并组合结果。

然而,并不是所有的查询都能做到这一点。您应该在此处阅读有关此功能的信息:http: //dev.mysql.com/doc/refman/5.6/en/index-merge-optimization.html

关于多列索引,如果您在 A、B、C、D 列上有索引,并且在 A、B、D 列上进行搜索,则可以使用该索引,但仅限于缩小范围根据您的条件搜索 A 列和 B 列。

如果您使用 EXPLAIN 并查看“ken_len”字段,您可以看到这方面的证据。key_len 将是该多列索引中使用的列中的总字节数。例如,如果 A、B、C、D 是 4 个 4 字节整数,key_len 可能高达 16。但如果只使用 A 和 B,key_len 将为 8。

于 2013-07-27T21:04:01.940 回答
0

鉴于此查询:

SELECT * FROM notes
    WHERE id_column='123'
      AND MATCH(text_column) AGAINST(search_text)

优化器执行它的唯一方法(据我所知)是

  1. 用于FULLTEXT(text_column)执行搜索的第二部分,然后
  2. 过滤掉那些没有id_column='123'; 此步骤不会使用任何索引。

FULLTEXT这是混合索引和非全文索引时的一般规则——首先是 FULLTEXT;没有使用其他索引。

但是......这是一个有时会加快复杂查询的技巧:

SELECT b.*
    FROM (
        SELECT id   -- assuming this is the PRIMARY KEY
            FROM notes
            WHERE MATCH(text_column) AGAINST(search_text)
         ) AS a
    JOIN notes AS b   -- "self join"
        ON b.id = a.id    -- just the PK
    JOIN ((other tables)) ON ...
    WHERE ((other messy or bulky stuff)) ...

这个想法是使用子查询浓缩成一个小值(id)的简短列表,然后返回(或进一步加入)以获取庞大的东西。

要为一些简单的查询构建最佳复合索引,请参阅我的索引食谱

于 2015-11-26T07:30:23.750 回答