两大类索引

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

聚簇索引

* 如果表设置了主键,则主键就是聚簇索引

* 如果表没有主键,则会默认第一个NOT NULL,且唯一(UNIQUE)的列作为聚簇索引

* 以上都没有,则会默认创建一个隐藏的row_id作为聚簇索引

由此可见,使用聚簇索引查询会很快,因为可以直接定位到行记录。

普通索引

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)

如:select * from user where id = 1;

聚簇索引查找过程

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

1. 先通过普通索引 age=30 定位到主键值 id=1

2. 再通过聚集索引 id=1 定位到行记录数据

普通索引查找过程第一步

普通索引查找过程第二步

回表查询

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

索引覆盖

例如:select id,age from user where age = 10;

如何实现覆盖索引

1、如实现:select id,age from user where age = 10;

explain分析:因为age是普通索引,使用到了age索引,通过一次扫描B+树即可查询到相应的结果,这样就实现了覆盖索引

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)即可

分页查询

因为name字段不是索引,所以在分页查询需要进行回表查询,此时Extra为Using filesort文件排序,查询性能低下。

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

mysql创建存储时覆盖_总结到位的MySQL 的覆盖索引与回表相关推荐

  1. mysql+索引优化+查询优化+存储优化_mysql利用覆盖索引避免回表优化查询

    前言 说到覆盖索引之前,先要了解它的数据结构:B+树. 先建个表演示(为了简单,id按顺序建): id name 1 aa 3 kl 5 op 8 aa 10 kk 11 kl 14 jk 16 ml ...

  2. MySQL创建数据库时指定编码和用户授权

    为什么80%的码农都做不了架构师?>>>    MySQL创建数据库时指定编码和用户授权 转载于:https://my.oschina.net/michao/blog/2989144

  3. php指定编码创建,MYSQL创建数据库时指定编码

    mysql 创建 数据库时指定编码很重要,很多开发者都使用了默认编码,但是我使用的经验来看,制定数据库的编码可以很大程度上避免倒入导出带来的乱码问题. 我们遵循的标准是,数据库,表,字段和页面或文本的 ...

  4. mysql 覆盖索引 简书_mysql覆盖索引与回表

    select id,name where name='shenjian' select id,name,sex* where name='shenjian'* 多查询了一个属性,为何检索过程完全不同? ...

  5. MySQL通过两表避免回表_mysql利用覆盖索引避免回表优化查询

    前言 说到覆盖索引之前,先要了解它的数据结构:B+树. 先建个表演示(为了简单,id按顺序建): id name 1 aa 3 kl 5 op 8 aa 10 kk 11 kl 14 jk 16 ml ...

  6. MySQL聚簇索引 非聚簇索引 覆盖索引与回表

    聚簇索引 聚簇索引定义:在InnoDB的聚簇索引的叶子节点存储的是行记录(其实是页结构,一个页包含多行数据),InnoDB必须要有至少一个聚簇索引.可以直接定位到行记录. 聚簇索引的类型: (1)如果 ...

  7. MySQL服务启动时显示本地计算机上的MySQL服务启动后停止;mysql服务无法启动

    两个问题: (1) 关闭mysql服务后后再次启动,显示:MySQL服务启动时显示本地计算机上的MySQL服务启动后停止.某些服务在未由其它服务-: (2)cmd窗口输入 net start mysq ...

  8. mysql 回表查询优化_mysql:若何行使笼罩索引制止回表优化查询

    说到笼罩索引之前,先要领会它的数据结构:B+树. 先建个表演示(为了简朴,id按顺序建): id name 1 aa 3 kl 5 op 8 aa 10 kk 11 kl 14 jk 16 ml 17 ...

  9. mysql 创建表格time类型_记一次关于 Mysql 中 text 类型和索引问题引起的慢查询的定位及优化...

    最近有用户反馈产品有些页面加载比较慢,刚好我在学习 Mysql 相关知识,所以先从 Mysql 慢查询日志开始定位: step1:通过慢查询日志定位具体 SQL 首先通过 SHOW VARIABLES ...

最新文章

  1. 【神经网络】(17) EfficientNet 代码复现,网络解析,附Tensorflow完整代码
  2. js实现kmp算法_「leetcode」459.重复的子字符串:KMP算法还能干这个!
  3. Django 3.2.5博客开发教程:实现模板之前的分析与准备
  4. 【分享】LazyLoad延迟加载(按需加载)
  5. primefaces_轻量级Web应用程序框架:PrimeFaces(JSF)+ Guice + MyBatis(第2部分)
  6. c语言笔记照片_C语言入门这一篇就够了-学习笔记
  7. shell学习之-sed用法解析_Shell脚本之sed的使用
  8. 【新番尝鲜】玛利亚狂热--百合VS伪娘之战
  9. windows10防Linux,用户禁用Defender提升Win10 Linux子系统性能
  10. webrtc在ubuntu14.04上的编译过程(12.04亦可)
  11. linux交叉编译 i2c-tools
  12. 【晶体管电路设计】一、晶体管设计概述与共射极放大电路
  13. 计算机用户名不显示,Windows10中设置不显示最后用户名的方法
  14. CSS如何设置div半透明效果
  15. 用VS2010打开VS2013、VS2015、VS2017等高版本项目
  16. ei论文计算机,容易写的计算机ei论文题目 计算机ei专业论文题目如何拟
  17. 多线程(1)——什么是多线程
  18. Keras.layers.BatchNormalization的批归一化方法
  19. Oracle中Blob和Clob类型的区别
  20. 北京高校应届生就业招聘信息网址

热门文章

  1. 通过OracleDataReader来读取BLOB类型的数据 (转载)
  2. 联想w540笔记本参数_2020年12月笔记本电脑推荐!联想、惠普、华为笔记本电脑推荐!18款高性价比笔记本电脑推荐!!!...
  3. java struts2 excel上传_文件上传方法,使用Struts2,实现Excel文件读取并写入数据库技术...
  4. usb3.0 linux无法识别,USB3.0接口不能识别U盘的解决方法
  5. 异或!!不占用额外空间!!
  6. slot多作用域 vue_详解Vue.js 作用域、slot用法(单个slot、具名slot)
  7. mysql游标表间数据迁移_FalseMySQL存储过程--gt;通过游标遍历和异常处理迁移数据到历史表-mysql-第二电脑网...
  8. 函数伪代码_Excel常用函数
  9. php reflectionmethod,PHP ReflectionMethod getClosure()用法及代码示例
  10. ibm+x3650+m4+linux+raid驱动,IBM X3650M4阵列卡驱动下载