Tim*_*sen 13 mysql indexing clustered-index
描述索引扩展使用的MySQL文档,以下表为例,后面是查询:
CREATE TABLE t1 (
i1 INT NOT NULL DEFAULT 0,
i2 INT NOT NULL DEFAULT 0,
d DATE DEFAULT NULL,
PRIMARY KEY (i1, i2),
INDEX k_d (d)
) ENGINE = InnoDB;
SELECT COUNT(*) FROM t1 WHERE i1 = 3 AND d = '2000-01-01';
Run Code Online (Sandbox Code Playgroud)
InnoDB内部将转换索引k_d以包含最后的主键.也就是说,实际索引k_d将打开(d, i1, i2),三列.
文档继续解释(强调我的):
在这种情况下,优化器不能使用主键,因为它包含列(i1,i2),查询不引用i2.相反,优化器可以在(d)上使用辅助索引k_d,执行计划取决于是否使用扩展索引.
我对以上陈述感到困惑.首先,它说i1是不足够使用两列的主键索引(i1, i2).然后,在第二句,它说,该指数k_d上(d, i1, i2) 可以使用,尽管只有d和i1正在使用,i2不存在的.
我对MySQL中的索引以及其他SQL版本的一般理解是,如果索引中所有列的子集都存在,则可以使用索引的左侧部分,从左侧开始.
主键(聚簇)索引和非聚簇二级索引有什么不同,它允许后者使用部分索引,但前者不能?
您链接到的页面上的文档部分不准确.
演示,在MySQL 5.7.21上运行:
mysql [localhost] {msandbox} (test) > CREATE TABLE t1 (
-> i1 INT NOT NULL DEFAULT 0,
-> i2 INT NOT NULL DEFAULT 0,
-> d DATE DEFAULT NULL,
-> PRIMARY KEY (i1, i2),
-> INDEX k_d (d)
-> ) ENGINE = InnoDB;
mysql [localhost] {msandbox} (test) > explain SELECT COUNT(*) FROM t1 WHERE i1 = 3 AND d = '2000-01-01';
+----+-------------+-------+------------+------+---------------+---------+---------+-------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+---------+---------+-------+------+----------+-------------+
| 1 | SIMPLE | t1 | NULL | ref | PRIMARY,k_d | PRIMARY | 4 | const | 1 | 100.00 | Using where |
+----+-------------+-------+------------+------+---------------+---------+---------+-------+------+----------+-------------+
Run Code Online (Sandbox Code Playgroud)
此查询选择PRIMARY索引,您可以看到key_len为4,证明它只使用32位INT列中的一个.
使用InnoDB表时,MySQL通常更喜欢使用PRIMARY索引(聚簇索引),因为它比使用二级索引更有效.