【发布时间】:2019-02-08 07:13:02
【问题描述】:
描述use of index extensions的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';
InnoDB 内部会将索引k_d 转换为最后包含主键。也就是说,实际的索引k_d 将在(d, i1, i2) 上,三列。
文档继续解释(强调我的):
优化器不能在这种情况下使用主键,因为它包含列 (i1, i2) 并且查询不引用 i2。相反,优化器可以使用 (d) 上的二级索引 k_d,执行计划取决于是否使用扩展索引。
我对上面的说法感到困惑。首先它说i1 不足以 使用两列(i1, i2) 的主键索引。然后,在第二句中,它说(d, i1, i2) 上的索引k_d 可以 被使用,尽管只有d 和i1 被使用,i2 不存在。
我对 MySQL 和其他 SQL 风格中的索引的一般理解是,如果索引中所有列的子集从左侧开始,则可以使用索引的左侧部分。
主键(聚集)索引和非聚集二级索引允许后者使用部分索引,而前者不能?
【问题讨论】:
-
我认为“不能”是不正确的。如果缺少
k_d,主键将是用户:sqlfiddle.com/#!9/9f9d6f/1
标签: mysql indexing clustered-index