MySQL中的索引

时间:2013-07-27 19:27:20

标签: mysql search indexing

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

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

...

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

3 个答案:

答案 0 :(得分:0)

问题1:

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

问题2:

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

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

答案 1 :(得分: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字节整数,则key_len可能多达16个。但如果只使用A和B,则key_len将为8。

答案 2 :(得分:0)

鉴于此查询:

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

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

  1. 使用FULLTEXT(text_column)执行搜索的第二部分,然后
  2. 过滤出没有id_column='123'的人;此步骤不会使用任何索引。
  3. 混合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)) ...
    

    我们的想法是使用子查询缩减为一个小值列表(ids),然后返回(或进一步加入)以获得笨重的东西。

    要为某些简单查询构建最佳复合索引,请参阅my index cookbook