首页 > 数据库 > mysql教程 > 哪种 MySQL 索引对于范围查询更有效:以高基数列开头还是以低基数列开头?

哪种 MySQL 索引对于范围查询更有效:以高基数列开头还是以低基数列开头?

Barbara Streisand
发布: 2024-11-29 02:55:14
原创
594 人浏览过

Which MySQL Index Is More Efficient for Range Queries: Leading with High or Low Cardinality Column?

范围查询的索引优化

基数较高的列有助于提高 MySQL 中的索引效率。但是,在范围查询的情况下,存在例外情况。

问题陈述

考虑具有以下结构的表:

CREATE TABLE `files` (
  `did` int(10) UNSIGNED NOT NULL DEFAULT '0',
  `filename` VARBINARY(200) NOT NULL,
  `ext` VARBINARY(5) DEFAULT NULL,
  `fsize` DOUBLE DEFAULT NULL,
  `filetime` DATETIME DEFAULT NULL,
  PRIMARY KEY (`did`,`filename`),
  KEY `fe` (`filetime`,`ext`),          -- Option 1
  KEY `ef` (`ext`,`filetime`)           -- Option 2
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
登录后复制

文件时间是不同的,而 ext 值的数量有限(即文件时间的基数较高,文件时间的基数较低)分机)。查询涉及具有以下条件的两列:

WHERE ext = '...'
AND filetime BETWEEN ... AND ...
登录后复制

哪个索引 fe 或 ef 更优化?

答案

令人惊讶,以 ext 作为第一列的索引,尽管基数较低,但效率更高查询。

说明

MySQL 的优化器分析索引替代方案并选择成本最低的一个。使用优化器跟踪,我们可以观察此选择背后的原因。

对于 fe(文件时间优先),MySQL 估计需要扫描 16684 行才能找到“gif”文件,即使范围条件为 on

然而,对于 ef (ext first),它估计它可以使用两个索引列并快速向下钻取到适当的行,从而导致成本仅为646.61。 MySQL 选择此索引是因为它可以使用更多的关键部分,从而使搜索更加高效。

结论

  • 优先考虑索引中涉及相等性测试的列,无论基数如何。
  • 查询计划不会超出第一个“范围”
  • 在这种情况下,基数与复合索引和范围查询无关。
  • InnoDB 可以利用超出用于过滤的索引列(“使用索引条件”)。

以上是哪种 MySQL 索引对于范围查询更有效:以高基数列开头还是以低基数列开头?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板