什么是回表查询?

InnoDB使用聚集索引,数据根据主索引存储在叶子节点上,辅助索引的data域存储主键。

myisam使用非聚集索引,即主索引(B+树)的叶子节点存储数据的地址(需要回表),myisam可以没有主键,数据也不是存储在B+主索引的叶子节点上的。

设有表:

t(id PK, name KEY, sex, flag);

画外音:id是聚集索引,name是普通索引。

表中有四条记录:

1, shenjian, m, A

3, zhangsan, m, A

5, lisi, m, A

9, wangwu, f, B

即:

两个B+树索引分别如上图:

(1)id为PK,聚集索引,叶子节点存储行记录;

(2)name为KEY,普通索引,叶子节点存储PK值,即id;

比如执行sql   select * from t where name='ls';

需要扫码两遍索引树:

(1)先通过普通索引定位到主键值id=5;

(2)在通过聚集索引定位到行记录;

这就是回表查询

什么是索引覆盖?

如果一个索引包含(或覆盖)所有需要查询的字段的值,称为‘覆盖索引',

就是select的数据列只用从索引中就能够取得,不必从数据表中读取。

如何实现索引覆盖进行优化查询?

常见的方法是:将被查询的字段,建立到联合索引里去。

create table user (

id int primary key,

name varchar(20),

sex varchar(5),

index(name)

)engine=innodb;

select id,name from user where name='shenjian';

能够命中name索引,索引叶子节点存储了主键id,通过name的索引树即可获取id和name,无需回表,符合索引覆盖,效率较高。

第二个SQL语句:

select id,name,sex* from user where name='shenjian';*

能够命中name索引,索引叶子节点存储了主键id,但sex字段必须回表查询才能获取到,不符合索引覆盖,需要再次通过id值扫码聚集索引获取sex字段,效率会降低。

如果把(name)单列索引升级为联合索引(name, sex)就不同了。

create table user (

id int primary key,

name varchar(20),

sex varchar(5),

index(name, sex)

)engine=innodb;

select id,name ... where name='shenjian';

select id,name,sex* ... where name='shenjian';*

都能够命中索引覆盖,无需回表。

mysql innodb索引覆盖_Mysql InnoDB 覆盖索引与回表相关推荐

  1. mysql 回表查询优化_MySQL优化:如何避免回表查询?什么是索引覆盖?

    转自:https://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ==&mid=2651962609&idx=1&sn=46e59691257 ...

  2. mysql 隐藏中间四位_MySQL知识体系——索引

    本文直切主题,针对InnoDB引擎描述索引及优化策略.在开始之前,需要读者了解: 二叉查找树(包括2-3查找树.红黑树等数据结构) MySQL的InnoDB引擎基础知识 索引初探 要了解索引,当然要了 ...

  3. mysql非聚集索引区间查询_mysql的聚集索引和非聚集索引,回表查询,索引覆盖,最左前缀原则略解...

    什么是聚集索引和非聚集索引 我们知道 Mysql 底层是用 B+ 树来存储索引的,且数据都存在叶子节点.对于 InnoDB 来说,它的主键索引和行记录是存储在一起的,因此叫做聚集索引(clustere ...

  4. mysql 索引原理_MySQL InnoDB索引原理和算法

    也许你经常用MySQL,也会经常用索引,但是对索引的原理和高级功能却并不知道,我们在这里一起学习下. InnoDB存储索引 在数据库中,如果索引太多,应用程序的性能可能会受到影响:如果索引太少,又会对 ...

  5. mysql btree检索策略_MySQL之Btree索引和HASH索引的区别以及索引优化策略

    索引是帮助mysql获取数据的数据结构.最常见的索引是Btree索引和Hash索引. 不同的引擎对于索引有不同的支持:Innodb和MyISAM默认的索引是Btree索引:而Mermory默认的索引是 ...

  6. mysql索引引擎_mysql搜索引擎和索引那些事

    mysql的存储引擎 三种存储方式 **InnoDB **(默认) 一个文件存储表结构,一个存储数据和目录(索引) # 一个文件 book_name | author| press | price | ...

  7. mysql 唯一索引和复合索引 区别_MySQL复合唯一索引分析

    MySQL复合唯一索引分析 关于复合唯一索引(unique key 或 unique index),网上搜索不少人说:"这种索引起到的关键作用是约束,查询时性能上没有得到提高或者查询时根本没 ...

  8. mysql innodb事务中_MySQL InnoDB如何保证事务特性示例详解

    前言 如果有人问你"数据库事务有哪些特性"?你可能会很快回答出原子性.一致性.隔离性.持久性即ACID特性.那么你知道InnoDB如何保证这些事务特性的吗?如果知道的话这篇文章就可 ...

  9. mysql必须的组件_mysql innodb的重要组件

    innodb包涵如下几个组件 一.innodb_buffer_pool: 1 它主要用来缓存数据与索引(准确的讲由于innodb中的表是由聚集索引组织的,所以数据只不是过主键这个索引的叶子结点). 二 ...

最新文章

  1. Python使用numpy中trim_zeros函数去除首尾0值的语法
  2. 简单说一下,你对CPU缓存的了解?
  3. Android Studio——怎么设置代码补全以及提示(详细)?
  4. 表数据比图数据更难处理
  5. RHEL5中YUM命令解决RPM包依赖性
  6. java实现随机抽取试题组成试卷
  7. centos7 安装python3.7.1(亲测下面的安装依赖包)
  8. 本地存储之sessionStorage
  9. 从Richard Young教授的系列研究看超级增强子发现背后的故事 (附超级增强子鉴定代码)
  10. 完全清除一个带包的项目文件的方法
  11. 在Django将已有数据库生成models文件
  12. 西瓜书+实战+吴恩达机器学习(十三)监督学习之随机森林 Random Forest
  13. Codeforces 319C DP 斜率优化
  14. MyBatis笔记二:配置
  15. python tornade 表单和模板
  16. qq不加好友实现网页在线聊天(qq在线客服)
  17. 天猫精灵打开电脑(网络唤醒)
  18. plc梯形图的c语言写法,PLC梯形图讲解.ppt
  19. b站网页版没有html,b站网页版
  20. 【树莓派C语言开发】实验15:电位计传感器(关联PCF8951)

热门文章

  1. Spring集成web环境步骤
  2. 常用IOC注解按照作用分类
  3. Request_获取请求参数通用方式演示
  4. 【OOP】零钱通项目
  5. 1-100以内的数求和,求出当和第一次大于20的当前数
  6. Asp.net MVC Filter监控页面性能和运行时间
  7. PostgreSQL 10.1 手册_部分 II. SQL 语言_第 9 章 函数和操作符_9.18. 数组函数和操作符...
  8. chapter3.1封装和解构
  9. poj3296--Rinse(三分)
  10. 清华裴丹:AIOps 落地路线图