【问题标题】:Understanding the order of indexing in MySQL了解 MySQL 中的索引顺序
【发布时间】:2014-05-09 12:46:08
【问题描述】:

表中有 3 列,包含 1000 万个条目。 col1col2col3col1 存储最多 2 位数字,col2 存储最多 9 位数字,col3 存储 0 或 1。

现在,当我按顺序 (col1,col2,col3) 复合索引时,我得到了结果(一些选择操作的结果,其中所有 3 列都涉及到 where 条件 - col1 的精确值和 col3 是指定的,而 col2) 的范围大约需要 0.5 秒,而如果我将其订购为 (col3,col1,col2) 大约需要 10 秒(对于相同的查询)。

据我了解,mysql 中的索引会按照我指定的顺序适当地连接 3 列中的值,并在初始排序后查询时运行二进制搜索。根据这种理解,如果我指定col3=1col3=0 它,那么一开始就提到col3 应该等同于如果不优于按顺序(col1,col2,col3)编写它将搜索范围缩小一半。

请解释异常!

【问题讨论】:

    标签: mysql database indexing


    【解决方案1】:

    嗯,做出这样的决定很难,但我个人会选择索引

    INDEX `compound_index`(col1,col2,col3);
    

    如果我不进行范围扫描,我会创建

    INDEX `compound_index`(col2,col1,col3);
    


    因为 col2 很可能具有更好的基数


    一般来说,如果您没有对表进行范围扫描,则具有更好基数的列将成为索引的第一列,依此类推..


    如果您有范围扫描,松散索引扫描比覆盖索引效果更好 http://www.arubin.org/blog/2010/11/18/loose-index-scan-vs-covered-indexes-in-mysql/

    【讨论】:

      【解决方案2】:

      如果您的 WHERE 子句为 col2 提供了一个值范围,那么索引中 col2 之后的任何内容都不是很有用。

      如果不清楚,假设您索引 (col1, col2, col3) 并且您的 where 子句是“where col1=5 and col2 between 2 and 4 and col3=1”。所以充其量,SQL 引擎可以到达索引中从 col1=5、col2=2 和 col3=1 开始的位置。理论上,它可以说当它到达 col2=2 的末尾时,当它看到第一个 col2=3, col3=0 时,它可以向前跳到 col2=3, col3=1。同样,当它到达 col2=4, col3=0 时,它可以向前跳到 col2=4, col3=1。但在实践中,在索引中四处跳动相对较慢。引擎以块为单位读取索引,因此一旦它获得一个块,如果它按顺序搜索该块,它已经将它全部存储在内存中。但是要跳过它可能必须读取另一个块,这意味着额外的 I/O 操作。我认为大多数 SQL 引擎都说,一旦你给出一个范围,索引中的所有内容都不会被使用。因此,引擎很可能会扫描从 5,2 到 5,4 的所有记录,并在执行过程中挑选出 col3=1,而不是在索引中四处跳动。

      鉴于此,虽然您说 col3 始终为 0 或 1。我认为 col1 和 col2 的值范围更广?为了便于讨论,我们假设它们每个都有 10 个可能的值,并且您在 col2 上的范围涵盖 3 个值。让我们假设所有值的分布相对均匀——1 和 2 一样多,等等。

      然后,如果您在 (col1, col2, col3) 上编制索引,引擎可以使用 col1 立即将搜索范围缩小到索引的 10%,然后使用 col2 缩小到该索引的 30% 或总索引的 3%。

      如果您在 (col3, col2, col1) 上建立索引,那么引擎可以使用 col3 将搜索范围缩小到索引的 50%,并将 col2 缩小到索引的 30% 或 15%。

      选项 (b) 的引擎搜索索引的次数是选项 1 的 5 倍。所以是的,它会更慢。

      【讨论】:

        猜你喜欢
        • 2015-09-08
        • 1970-01-01
        • 2010-11-18
        • 1970-01-01
        • 2011-06-14
        • 1970-01-01
        • 2012-09-25
        • 1970-01-01
        • 2015-05-30
        相关资源
        最近更新 更多