两大类索引

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

聚簇索引

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

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

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

InnoDB的聚簇索引的叶子节点存储的是行记录(其实是页结构,一个页包含多行数据),InnoDB必须要有至少一个聚簇索引。

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

普通索引

普通索引也叫二级索引,除聚簇索引外的索引,即非聚簇索引。

InnoDB的普通索引叶子节点存储的是主键(聚簇索引)的值,而MyISAM的普通索引存储的是记录指针。

示例

建表

mysql>createtableuser(

->idint(10)auto_increment,

->namevarchar(30),

->agetinyint(4),

->primarykey(id),

->indexidx_age(age)

->)engine=innodbcharset=utf8mb4;

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

填充数据

insertintouser(name,age)values('张三',30);

insertintouser(name,age)values('李四',20);

insertintouser(name,age)values('王五',40);

insertintouser(name,age)values('刘八',10);

mysql>select*fromuser;

+----+--------+------+

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

dropindexidx_ageonuser;

createindexidx_age_nameonuser(`age`,`name`);

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

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

全表count查询优化

mysql>createtableuser(

->idint(10)auto_increment,

->namevarchar(30),

->agetinyint(4),

->primarykey(id),

->)engine=innodbcharset=utf8mb4;

例如:select count(age) from user;

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

createindexidx_ageonuser(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数据库索引回表_简述 MySQL 数据库的覆盖索引与回表相关推荐

  1. mysql 执行计划 什么用_简述MySQL的执行计划的作用及使用方法

    作为程序员,难免要和数据库打交道,一般情况下,我们不是DBA ,但是又要写很多SQL,因此SQL效率就成了很大的问题.关于SQL效率优化,除了要掌握一定优化技巧外, 还得有很多经验的积累,但是这里我们 ...

  2. mysql 复制技术有什么用_简述MySQL复制的优点

    MySQL复制是指从一个mysql服务器(MASTER)将数据通过日志的方式经过网络传送到另一台或多台mysql服务器(SLAVE),然后在slave上重放(replay或redo)传送过来的日志,以 ...

  3. mysql主从复制原理详解_简述 MySQL 逻辑架构与主从复制原理。

    ↑ 点击上面 "时代Java"关注我们,关注新技术,学习新知识! 1.Mysql逻辑架构图 如果能在脑海中构建出MySql各组件之间如何协同工作的架构图,就会有助于深入理解MySq ...

  4. 定义mysql字段的编码模式_在 mysql 中 定义 数据库,表,列时,设定的各个的编码格式。...

    最近看了一下KIGG框架,发现在用EF + MYSQL数据库时,数据出现了乱码,用工具(Navicat )查看一下表category的结构发现 KIGG 数据库的默认情况是用latin1编码的(DEF ...

  5. Mysql商品和图片表_【mysql】数据库设计模式:多个图片怎么和商品关联

    比如发布商品,标题,单价,属性- 还有一个产品图片,而产品图片一般是选择图片后就上传了图片,这时候产品应该入库啦,这时候还不知道这个商品ID,这样怎么关联商品? 如果是提交后修改,这时候知道了商品ID ...

  6. mysql到mysqli转变表_利用mysql和mysqli取得mysql的所有数据库和库中的所有表

    /*** mysqli  op mysql demo*//***公用函数*//***功能:列出一个数据库的所有表*@param$dbname*@param$con*/functionlist_tabl ...

  7. 使用mysql命令还原student表_自用mysql自带命令实现数据库备份还原的方法

    本文章介绍了都是mysql常用的命令一些数据导入导出的命令了,只要我们撑握这些命令就可以方法快速的给我们的数据库进行备份还原了 mysql数据到导入导出 500MB数据 问题:500M的库表数据,需要 ...

  8. mysql数据库特点特性_简述MySQL数据库的特性和优势

    众所周知,MySQL数据库速度快.可靠性强,而且极具适应性.因此可以说,MySQL是管理内容的最好选择,尤其是对于在不需要事务化处理的情况下.本文就和大家一起来认识一下MySQL数据库,了解它的特性和 ...

  9. mysql中建立索引的原则_在SQL数据库中设定索引的原则是什么?(注意是设定不是创建)...

    其实索引的好坏还和你的查询语句有关系,就是where后边的列有关.如果两者协调不好的话,同样应用索引也得不到什么好处.下边的文章希望对你有益: 索引的设计 A:尽量避免表扫描检查你的查询语句的wher ...

最新文章

  1. Ubuntu安装、使用postgresql数据库
  2. webpack 实践笔记(一)--- 入门
  3. 第一讲 网络安全概述笔记
  4. 阿里云的java规范_阿里JAVA开发强制要求的15条并发处理规范,切记
  5. 解决VS2013中出现类似于error C4996: 'scanf': This function or variable may be unsafe的安全检查错误
  6. 计算机语言mod(m n),关于一段地址对齐的位运算代码的解释
  7. boost::endian模块宏BOOST_SCOPED_ENUM的测试程序
  8. Composer快速入门
  9. Pocketflow 使用
  10. mysql 任务计划 /etc/cron.d_Linux /etc/cron.d增加定时任务
  11. 大数据每周分享第 008 期
  12. phpMyAdmin出现错误 Access denied for user 'root'@'localhost' (using password: NO)
  13. 很久没来这里,今天的评测java怪东西,左右Date类和时间戳转换
  14. visio指向插图任意位置和任意改变箭头形状
  15. android 微博 登录,Android第三方登录之微博登录
  16. 数学中的两个重要极限公式
  17. uni-app 生命周期
  18. vue项目,引入插件element ui 样式不生效
  19. 保险业首季度保费收入猛增五成
  20. 软件版本各阶段英文名称

热门文章

  1. Win11正式版版号 Win11正式版最新版本号介绍
  2. mysql 常用日期,时间函数
  3. CRT远程工具连接服务器CentOS
  4. 如何使用Java进行简单爬虫
  5. 《异星入境》-超粒方
  6. 阿里的CTR预测(二):Deep Interest Evolution Network
  7. 浏览器从输入到输出的过程与原理一
  8. 《R语言机器学习:实用案例分析》——1.8节总结
  9. Android Studio 无法启动模拟器的一种可能是你装的是Ghost版的系统
  10. java 构造块_java中构造方法、普通块、静态代码块、构造块的执行顺序