范围查询的索引优化
基数较高的列有助于提高 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 选择此索引是因为它可以使用更多的关键部分,从而使搜索更加高效。
结论
以上是哪种 MySQL 索引对于范围查询更有效:以高基数列开头还是以低基数列开头?的详细内容。更多信息请关注PHP中文网其他相关文章!