
偶然看到了一个题目: 给定 yfd_interviewer 数据库表结构如下:
CREATE TABLE `yfd_interviewer` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `name` VARCHAR(32) NOT NULL DEFAULT '', `age` INT(11) NOT NULL, `createdTime` BIGINT(20) NOT NULL, `updatedTime` BIGINT(20) NOT NULL, PRIMARY KEY (`id`), KEY `name_index` (`name`), KEY `age_index` (`age`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 给定以下 SQL:
S1: SELECT * FROM `yfd_interviewer` WHERE name = ‘ kebi ’; S2: SELECT * FROM `yfd_interviewer` WHERE age = 20; S3: SELECT * FROM `yfd_interviewer` WHERE name = ‘ kenan ’ AND age = 20; S4: SELECT * FROM `yfd_interviewer` WHERE age = 20 AND name = ‘ kenan ’; 以下关于索引使用描述不正确的是哪个?
答案是 D,但是我不太明白,这个表里面 name 和 age 都是单列索引,虽然 S4 age 在前,SQL 在执行查询优化的时候会根据字段的顺序,优先选择 name 索引?谢谢大家
1 Allianzcortex Jan 5, 2019 是。关键不是在查询语句上,而是在创建语句上。创建 SQL 表时为了提高性能需要把最常用的 index/key 放在前面(原话是 you should put columns that will be the most selective at the beginning of the index declaration)。在这个表里 name 比 index 索引在前,所以对 C D 选项都是会优先查询 name 再查 age。 |
2 junan0708 Jan 5, 2019 via Android @Allianzcortex 这个和索引顺序无关,只是理论上 name 的区分度更好 |
3 Allianzcortex Jan 5, 2019 @junan0708 是有的呀。我找了下当时的笔记,是看的这个问题: https://stackoverflow.com/questions/2292662/how-important-is-the-order-of-columns-in-indexes . 对创建语句:The order of columns is critical。对查询语句:For seeks the order of columns is irrelevant. 就是题目里 C/D 说的这样。 |
4 F281M6Dh8DXpD1g2 Jan 5, 2019 "you should put columns that will be the most selective at the beginning of the index declaration" 并不是最常用的 index / key selectivity 的概念了解一下 |
6 Allianzcortex Jan 5, 2019 via iPhone @liprais 口误口误。想表达的意思就是最能区分出,不是最常用的 |
7 hilbertz Jan 5, 2019 explain 你自己看下,没有绝对的答案,这取决于具体的数据分布,可能只用一个返回最少的,可能 2 个都用,也可能根本不用 |
8 Allianzcortex Jan 5, 2019 @hilbertz 是的,但从这道题目来说应该是不用考虑数据分布,单纯从索引的角度来看 |
9 min Jan 5, 2019 楼上 hilbertz 说得对,实际执行的时候用哪个索引是不一定的 |
10 charles2java Jan 6, 2019 via Android 排除法,前面 3 个都是对的 |
11 winoros Jan 6, 2019 D 的反面并不是会优先选另一个索引 索引的选择考虑的过滤效果等影响,条件的顺序几乎不会是某个 RDBMS 选择索引的一个影响比较大的引子 通常 RDBMS 的实现中,第三个 SQL 和第四个 SQL 最后选择的情况会是一样的 |
12 pathbox Jan 6, 2019 via iPhone 和你表的数据情况有关吧,用 explain 看,能查的快的就是有效索引 |
13 HiJackXD Jan 6, 2019 联合索引才是把最具区分度的排前面,因为是最左侧匹配。 至于 D,where 里的字段排序不会影响索引的使用。 |