MySQL数据库原理学习(十五)
2.6.6 覆盖索引
尽量使用覆盖索引,减少select *。那么什么是覆盖索引呢?覆盖索引是指 查询使用了索引,并且需要返回的列,在该索引中已经全部能够找到 。
接下来,我们来看一组SQL的执行计划,看看执行计划的差别,然后再来具体做一个解析。
explain select id, profession from tb_user where profession = '软件工程' and age =
31 and status = '0' ;
explain select id,profession,age, status from tb_user where profession = '软件工程'
and age = 31 and status = '0' ;
explain select id,profession,age, status, name from tb_user where profession = '软
件工程' and age = 31 and status = '0' ;
explain select * from tb_user where profession = '软件工程' and age = 31 and status
= '0';
上述这几条SQL的执行结果为:
从上述的执行计划我们可以看到,这四条SQL语句的执行计划前面所有的指标都是一样的,看不出来差异。但是此时,我们主要关注的是后面的Extra,前面两天SQL的结果为 Using where; Using Index ; 而后面两条SQL的结果为: Using index condition 。
因为,在tb_user表中有一个联合索引 idx_user_pro_age_sta,该索引关联了三个字段profession、age、status,而这个索引也是一个二级索引,所以叶子节点下面挂的是这一行的主键id。所以当我们查询返回的数据在 id、profession、age、status 之中,则直接走二级索引直接返回数据了。如果超出这个范围,就需要拿到主键id,再去扫描聚集索引,再获取额外的数据
了,这个过程就是回表。而我们如果一直使用select * 查询返回所有字段值,很容易就会造成回表查询(除非是根据主键查询,此时只会扫描聚集索引)。
为了大家更清楚的理解,什么是覆盖索引,什么是回表查询,我们一起再来看下面的这组SQL的执行过程。
A. 表结构及索引示意图:
id是主键,是一个聚集索引。name字段建立了普通索引,是一个二级索引(辅助索引)。
B. 执行SQL : select * from tb_user where id = 2;
根据id查询,直接走聚集索引查询,一次索引扫描,直接返回数据,性能高。
C. 执行SQL:selet id,name from tb_user where name = 'Arm';
虽然是根据name字段查询,查询二级索引,但是由于查询返回在字段为 id,name,在name的二级索引中,这两个值都是可以直接获取到的,因为覆盖索引,所以不需要回表查询,性能高。
D. 执行SQL:selet id,name,gender from tb_user where name = 'Arm';
由于在name的二级索引中,不包含gender,所以,需要两次索引扫描,也就是需要回表查询,性能相对较差一点。
相关文章
- MySQL下强制删除数据的技巧(mysql强制删除数据)
- MySQL中使用组合主键的优势(mysql组合主键)
- MySQL中字段减法操作(mysql字段减法)
- 关联MySQL实现一对多表关联的高效方法(mysql一对多表)
- MySQL查看数据库容量大小(mysql查库大小)
- MySQL的默认函数:强力升级你的数据库性能(mysql默认函数)
- 优化MySQL数据库实现数据数量优化的策略(mysql数据数量)
- 数据库MySQL 数据库连接:使用JDBC实现(用jdbc连接mysql)
- MySQL怎样有效管理大字段存储(mysql大字段存储)
- 利用MySQL临时表构建高效索引(mysql临时表索引)
- 函数MySQL的Length函数使用指南(mysql的length)
- 数据超高效:MySQL为千万数据保驾护航(数据库mysql千万)
- 如何在MySQL中添加新的数据库表?(mysql添加表的数据库)
- MySQL数据库主机地址简介(mysql数据库主机地址)
- C如何查询MySQL?25字带你了解。(c查询mysql)
- 使用MySQL nowait命令,提高数据库处理效率(mysqlnowait)
- MySQL中concat函数的使用方法(mysql中cancat)
- CDH集群下的MySQL数据库技术实践(cdh mysql数据库)
- 1 MySQL 数据库的管理与优化 2 MySQL 解决复杂的数据存储与交互(2个 mysql)
- MySQL 1249错误挽救数据库出现问题(1249错误mysql)
- MySQL数据库技术插入数据无误,避免虚假插入(mysql不存在假插入)
- MySQL存储引擎比较选择合适的引擎提高数据库性能和效率(mysql不同的存储引擎)
- MySQL数据存储探讨不同存储类型(mysql 不同存储类型)