两大类索引

使用的存储引擎:MySQL5.7 InnoDB

聚簇索引

* 如果表设置了主键,则主键就是聚簇索引
* 如果表没有主键,则会默认第一个NOT NULL,且唯一(UNIQUE)的列作为聚簇索引
* 以上都没有,则会默认创建一个隐藏的row_id作为聚簇索引

InnoDB的聚簇索引的叶子节点存储的是行记录(其实是页结构,一个页包含多行数据),InnoDB必须要有至少一个聚簇索引。
由此可见,使用聚簇索引查询会很快,因为可以直接定位到行记录。

普通索引

普通索引也叫二级索引,除聚簇索引外的索引,即非聚簇索引。
InnoDB的普通索引叶子节点存储的是主键(聚簇索引)的值,而MyISAM的普通索引存储的是记录指针。

示例

建表

mysql> create table user(-> id int(10) auto_increment,-> name varchar(30),-> age tinyint(4),-> primary key (id),-> index idx_age (age)-> )engine=innodb charset=utf8mb4;

id 字段是聚簇索引,age 字段是普通索引(二级索引)

填充数据

insert into user(name,age) values('张三',30);
insert into user(name,age) values('李四',20);
insert into user(name,age) values('王五',40);
insert into user(name,age) values('刘八',10);mysql> select * from user;
+----+--------+------+
| id | name  | age |
+----+--------+------+
| 1 | 张三  |  30 |
| 2 | 李四  |  20 |
| 3 | 王五  |  40 |
| 4 | 刘八  |  10 |
+----+--------+------+

索引存储结构

id 是主键,所以是聚簇索引,其叶子节点存储的是对应行记录的数据

聚簇索引(ClusteredIndex)

age 是普通索引(二级索引),非聚簇索引,其叶子节点存储的是聚簇索引的的值

普通索引(secondaryIndex)

如果查询条件为主键(聚簇索引),则只需扫描一次B+树即可通过聚簇索引定位到要查找的行记录数据。
如:select * from user where id = 1;

聚簇索引查找过程

如果查询条件为普通索引(非聚簇索引),需要扫描两次B+树,第一次扫描通过普通索引定位到聚簇索引的值,然后第二次扫描通过聚簇索引的值定位到要查找的行记录数据。 如:select * from user where age = 30;

1. 先通过普通索引 age=30 定位到主键值 id=1
2. 再通过聚集索引 id=1 定位到行记录数据

普通索引查找过程第一步

普通索引查找过程第二步

回表查询

先通过普通索引的值定位聚簇索引值,再通过聚簇索引的值定位行记录数据,需要扫描两次索引B+树,它的性能较扫一遍索引树更低。

索引覆盖

只需要在一棵索引树上就能获取SQL所需的所有列数据,无需回表,速度更快。
例如:select id,age from user where age = 10;

如何实现覆盖索引

常见的方法是:将被查询的字段,建立到联合索引里去。
1、如实现:select id,age from user where age = 10;
explain分析:因为age是普通索引,使用到了age索引,通过一次扫描B+树即可查询到相应的结果,这样就实现了覆盖索引

2、实现:select id,age,name from user where age = 10;
explain分析:age是普通索引,但name列不在索引树上,所以通过age索引在查询到id和age的值后,需要进行回表再查询name的值。此时的Extra列的NULL表示进行了回表查询

为了实现索引覆盖,需要建组合索引idx_age_name(age,name)

drop index idx_age on user;
create index idx_age_name on user(`age`,`name`);

explain分析:此时字段age和name是组合索引idx_age_name,查询的字段id、age、name的值刚刚都在索引树上,只需扫描一次组合索引B+树即可,这就是实现了索引覆盖,此时的Extra字段为Using index表示使用了索引覆盖。

哪些场景适合使用索引覆盖来优化SQL

全表count查询优化

mysql> create table user(-> id int(10) auto_increment,-> name varchar(30),-> age tinyint(4),-> primary key (id),-> )engine=innodb charset=utf8mb4;

例如:select count(age) from user;

使用索引覆盖优化:创建age字段索引

create index idx_age on user(age);

列查询回表优化

前文在描述索引覆盖使用的例子就是
例如:select id,age,name from user where age = 10;
使用索引覆盖:建组合索引idx_age_name(age,name)即可

分页查询

例如:select id,age,name from user order by age limit 100,2;
因为name字段不是索引,所以在分页查询需要进行回表查询,此时Extra为Using filesort文件排序,查询性能低下。

使用索引覆盖:建组合索引idx_age_name(age,name)

MySQL 的覆盖索引的实现相关推荐

  1. mysql的覆盖索引原理_「Mysql索引原理(七)」覆盖索引

    通常大家都会根据查询的WHERE条件来创建合适的索引,不过这只是索引优化的一个方面.设计优秀的索引应该考虑到整个查询,而不单单是WHERE条件部分.索引确实是一种查找数据的高效方式,但是MySQL也可 ...

  2. 五分钟告诉你什么是MySQL的覆盖索引

    文章目录 五分钟告诉你什么是MySQL的覆盖索引 覆盖索引 总结 参考 五分钟告诉你什么是MySQL的覆盖索引 前面我们已经对MySQL索引底层原理多少有一定的了解了,还不是很了解的小伙伴可以看我之前 ...

  3. mysql覆盖数据_理解MySQL数据库覆盖索引

    话说有这么一个表: CREATE TABLE`user_group` ( `id`int(11) NOT NULLauto_increment, `uid`int(11) NOT NULL, `gro ...

  4. MySQL 的覆盖索引与回表

    一.两大类索引 聚簇索引: 如果表设置了主键,则主键就是聚簇索引 如果表没有主键,则会默认第一个NOT NULL,且唯一(UNIQUE)的列作为聚簇索引 以上都没有,则会默认创建一个隐藏的row_id ...

  5. mysql创建存储时覆盖_总结到位的MySQL 的覆盖索引与回表

    两大类索引 使用的存储引擎:MySQL5.7 InnoDB 聚簇索引 * 如果表设置了主键,则主键就是聚簇索引 * 如果表没有主键,则会默认第一个NOT NULL,且唯一(UNIQUE)的列作为聚簇索 ...

  6. MySQL 的覆盖索引为什么不需要回表

    结论:innodb二级索引(非聚餐索引)除了存储id外还是存储了对应字段的数据的,所以覆盖索引不需要回表 参考联合索引最左匹配原则,根据字段出现的顺序排序的 以下内容来源地址:https://zhua ...

  7. mysql 数据库被覆盖_理解MySQL数据库覆盖索引

    话说有这么一个表: CREATE TABLE `user_group` ( `id` int(11) NOT NULL auto_increment, `uid` int(11) NOT NULL, ...

  8. mysql 创建覆盖索引_MySql覆盖索引

    mysql的innodb引擎通过搜索树方式实现索引,索引类型分为主键索引和二级索引(非主键索引),主键索引树中,叶子结点保存着主键即对应行的全部数据:而二级索引树中,叶子结点保存着索引值和主键值,当使 ...

  9. mysql 创建覆盖索引_Mysql覆盖索引 covering index 或者 index coverage

    组合索引 提到组合索引,大家都知道"最左前缀"原则.例如,创建索引 idx_name_age (name,age) ,通常情况下,where age=50 或者 where age ...

最新文章

  1. 阿里云开发者大会:资源加应用酝酿云存储变局
  2. python用一行代码画个迷宫_用 Python 制作一个迷宫游戏
  3. 设计模式学习笔记——解释器(Interpreter)模式
  4. 2013年5月16日星期四初始sqlserver附加数据库权限及maven和selenium
  5. mysql 6.2 安装教程_CentOS 6.2 安装 MySQL 5.7.28的教程(mysql 笔记)
  6. 《为自己工作——世界顶级设计师成功法则》—第1章1.2节有同情心
  7. Memory Networks
  8. hough变换圆检测matlab,hough变换检测圆的matlab程序
  9. 时间序列预测在R中的应用 (Part1 简介和预测工具集)
  10. Python3对多股票的投资组合进行分析
  11. 考研政治---马克思主义基本原理概论---绪论
  12. Python 自动化测试实战
  13. 清华计算机录取通知书,清华送出第一批录取通知书,这些被刷屏的学霸,有怎样的成长密码...
  14. lightroom 闪退_苹果iPhone11手机APP频繁闪退怎么办?如何修复?
  15. SylixOS命令行下内存操作/测试工具
  16. 期刊论文发表的重复率要求
  17. 事务开启SpringBoot报错 The bean ‘xxxImpl’ could not be injected as a ‘com.xxx.service.impl.xxxServiceImpl
  18. MAC地址中的“O”和“0”怎么区别?命令行黑窗口界面的“O”和“0”怎么区别?
  19. 通过PreparedStatement预防SQL注入
  20. nginx启动无反应

热门文章

  1. 对计算机的过度依赖英语作文,不要过度依赖手机英语作文范文
  2. Mockito模拟器
  3. PDF怎么转换成JPG图片?大家赶快学起来!
  4. 计算机打竖字体,告诉你Photoshop怎么输入竖排的文字
  5. i.MX283开发板SPI驱动——RC522
  6. 松下a6伺服驱动器说明书_伺服电机-且看松下伺服电机如何进行转速设置?
  7. C# 图片截图(圆形)
  8. 计算机硬盘能否做u盘用怎么用,U盘能当电脑硬盘用么
  9. 计算机操作培训总结,计算机操作培训总结
  10. 安卓ANR问题排查手册