MySQL联合索引默认会包含主键么?

比如我的主键是id,然后创建了一个联合索引(name,age)
那么这个联合索引,是不是默认包含了主键?
引擎Innodb

阅读 14.7k
6 个回答

我不说结论,就举个例子,假设表有4个列(比题主多1列,这样可以把问题说明白):

id, name, age, sex

id是主键,(name, age)是索引,那么在InnoDB里实际上包含2个索引(即2个B+树):

id -> (name, age, sex); // 主索引,每个InnoDB的表必然包含一个主索引,主索引必然包含所有的列
(name, age) -> id; // (name, age)这个索引

现在问题来了,如果你的查询是:

SELECT id FROM table WHERE name = ? AND age = ?

只要查(name, age)索引就可以了,不会再查主索引的;但如果查询是:

SELECT id, sex FROM table WHERE name = ? AND age = ?

先查(name, age)索引查到id后,再会查主索引查到sex,所以会比刚才多查一次。

===

把问题展开一下,上面这条语句如果是被反复使用的,可以这样优化查询效率:可以把(name, age, sex)作为一个索引,这样查(name, age)可以直接查到idsex,不需要再查主索引了。

innodb普通索引末尾都会带上主键值
查询主键直接在索引段上就可以完成
查询其他字段会先根据索引找到主键值,再根据主键查找聚簇索引找到你要的字段

刚才做了下测试,MYSQL5.7,确实包括。当查询条件命中这条记录时。innodb会根据命中记录的值去读取对应行的ID(这一步是根据指针操作)。一次查询实际上会查找两次(第1次根据索引查找到记录指针,第二次根据指针查找ID)。

我想你问的应该是覆盖索引。这样第一次根据索引查找到记录指针时,由于索引中有ID,那么不会再去根据指针查询ID了。

楼主说的应该是二级多列索引
Innodb引擎下所有的表都会默认有一个聚簇索引,该索引包含数据表中所有列值

然后除了这个聚簇索引,接下来才是我们自己创建的索引, 一般统称为二级索引,比如楼主的多列索引其实就是二级索引中的种

注意二级索引是会自动包含你表中的主键列的,所以如果你的多列索引想包含主键列的话,不要手动在索引中包含,当然,数据库优化器可能会帮你进行优化 但还是避免这种写法

这也是innodb引擎和myisam的区别之一,前者有聚簇索引,后者没有
前者索引数据需要现在二级索引中找到主键盘后根据主键到聚簇索引中找到最终数据,需要走两次索引树 而后者不管创建多少二级索引,都是通过索引直接找到叶子节点中指向具体表中的数据的那个指针

不包括id。
在查询的时候只要where有name、age就会用到索引,
而id是主键,特殊的唯一性索引,算单列索引

Innodb表的数据存在主键索引树(B+Tree)叶子节点上;二级索引存储索引字段值与主键。通过二级索引查找需要回表到主键树上查处记录

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题