比如我的主键是id,然后创建了一个联合索引(name,age)
那么这个联合索引,是不是默认包含了主键?
引擎Innodb
刚才做了下测试,MYSQL5.7,确实包括。当查询条件命中这条记录时。innodb会根据命中记录的值去读取对应行的ID(这一步是根据指针操作)。一次查询实际上会查找两次(第1次根据索引查找到记录指针,第二次根据指针查找ID)。
我想你问的应该是覆盖索引。这样第一次根据索引查找到记录指针时,由于索引中有ID,那么不会再去根据指针查询ID了。
楼主说的应该是二级多列索引
Innodb引擎下所有的表都会默认有一个聚簇索引,该索引包含数据表中所有列值
然后除了这个聚簇索引,接下来才是我们自己创建的索引, 一般统称为二级索引,比如楼主的多列索引其实就是二级索引中的种
注意二级索引是会自动包含你表中的主键列的,所以如果你的多列索引想包含主键列的话,不要手动在索引中包含,当然,数据库优化器可能会帮你进行优化 但还是避免这种写法
这也是innodb引擎和myisam的区别之一,前者有聚簇索引,后者没有
前者索引数据需要现在二级索引中找到主键盘后根据主键到聚簇索引中找到最终数据,需要走两次索引树 而后者不管创建多少二级索引,都是通过索引直接找到叶子节点中指向具体表中的数据的那个指针
5 回答3.2k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
3 回答3.6k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
1 回答2.4k 阅读✓ 已解决
1 回答2.9k 阅读✓ 已解决
5 回答1.4k 阅读
我不说结论,就举个例子,假设表有4个列(比题主多1列,这样可以把问题说明白):
id
是主键,(name, age)
是索引,那么在InnoDB里实际上包含2个索引(即2个B+树):现在问题来了,如果你的查询是:
只要查
(name, age)
索引就可以了,不会再查主索引的;但如果查询是:先查
(name, age)
索引查到id
后,再会查主索引查到sex
,所以会比刚才多查一次。===
把问题展开一下,上面这条语句如果是被反复使用的,可以这样优化查询效率:可以把
(name, age, sex)
作为一个索引,这样查(name, age)
可以直接查到id
和sex
,不需要再查主索引了。