这个文章我们略过很复杂的技术细节,直接告诉你怎么用,如果你有兴趣可以自己查下资料学习。
毕竟知识只有自己总结过的才是自己的。
注:我们讨论的是你的数据库引擎是InnoDB
什么是回表:
看下边的sql,其中表user 且name 建立索引
select * from user where name='张三';
这条sql 语句因为name 建立了 索引,索叶子节点是保存的主键id(你可以这样理解就是索引下边挂着注主键),然后 拿到主键id之后 在查询user 所有信息。
注意这里 拿索引下边的id 取查所有数据 叫回表。我们建立索引的时候要考虑回表的情况。
那怎么不回表呢:
看下边这个sql
select id from user where name='张三';
这样就不回表了,因为name 索引下边直接挂着id 可以直接返回id
我们说下 mysql 针对这种回表情况 有几种优化 :
1. 覆盖索引
2.最左前缀原则
3.索引下推
首先1.覆盖索引 就是我们上边这种情况 我们不讨论了
索引下推
假设我们有一个sql 我们有一个联合索引(name,age)
select * from user where name='张三' and age=18;
正常情况下 会走索引name, 联合索引(name,age) 叶子节点会有id 然后 通过主键id查询 对比(回表) age 是否等于18。