什么是索引回表,如何避免(索引覆盖)
聚簇索引
- * 如果表设置了主键,则主键就是聚簇索引
- * 如果表没有主键,则会默认第一个NOT NULL,且唯一(UNIQUE)的列作为聚簇索引
- * 以上都没有,则会默认创建一个隐藏的row_id作为聚簇索引
其他 非聚簇
表中有四条记录:
1, shenjian, m, A
3, zhangsan, m, A
5, lisi, m, A
9, wangwu, f, B
聚集索引(存储行记录) 普通索引(叶子节点存储聚簇索引值)
聚簇索引查询会很快,因为可以直接定位到行记录
id是聚簇索引,name是普通索引。
普通索引 需要扫码两遍索引树
(1)先通过普通索引定位到主键值id=5;
(2)在通过聚集索引定位到行记录;
这就是所谓的回表查询,先定位主键值,再定位行记录,它的性能较扫一遍索引树更低。
如何实现覆盖索引
常见的方法是:将被查询的字段,建立到联合索引里去。
哪些场景适合使用索引覆盖来优化SQL
全表count查询优化
1 2 3 4 5 6 |
|
例如:select count(age) from user;
使用索引覆盖优化:创建age字段索引
1 |
|
列查询回表优化
前文在描述索引覆盖使用的例子就是
例如: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)
参考https://www.jb51.net/article/180267.htm
什么是索引回表,如何避免(索引覆盖)相关推荐
- oracle 索引回表,oracle 索引简单总结
建立索引时先进行排序,逻辑上分为Root(根块),Branch(茎块),leaf(叶子块).leaf中存在索引列的值.长度.和所在rowid,茎块存了指向具体茎块的指针,root块同理.这是逻辑上的划 ...
- mysql 回表 覆盖索引_mysql 14 覆盖索引+回表
举个栗子,假如有一张表:tableA t(id PK, name KEY, sex, flag); 即id是聚集索引,name是普通索引. 分别执行2条SQL SQL1 : select id, ...
- mysql非聚集索引区间查询_mysql的聚集索引和非聚集索引,回表查询,索引覆盖,最左前缀原则略解...
什么是聚集索引和非聚集索引 我们知道 Mysql 底层是用 B+ 树来存储索引的,且数据都存在叶子节点.对于 InnoDB 来说,它的主键索引和行记录是存储在一起的,因此叫做聚集索引(clustere ...
- mysql版本的索引类型_【mysql】索引 回表 覆盖索引 索引下推
索引类型 索引类型分为主键索引和非主键索引.(一定要牢记,是怎么存储数据的) 主键索引的叶子节点存的是整行数据.在 InnoDB 里,主键索引也被称为聚簇索引(clustered index). 非主 ...
- mysql 回表查询优化_MySQL中的回表查询与索引覆盖:一次百万级别分页查询使用Limit 从90秒到0.6毫秒的优化...
这里写目录标题 事故现场 解决方案 提到的"回表查询" InnoDB的索引 什么是回表查询 怎么优化回表查询 事故现场 数据库使用的MySQL,有一个日志表,需要进行分页查询,于是 ...
- mysql数据库索引回表_简述 MySQL 数据库的覆盖索引与回表
两大类索引 使用的存储引擎:MySQL5.7 InnoDB 聚簇索引 *如果表设置了主键,则主键就是聚簇索引 *如果表没有主键,则会默认第一个NOTNULL,且唯一(UNIQUE)的列作为聚簇索引 * ...
- oracle查询不走索引全表扫描,使用索引快速全扫描(Index FFS)避免全表扫描的若干场景-Oracle...
使用索引快速全扫描(Index FFS)避免全表扫描的若干场景 什么使用使用Index FFS比FTS好? Oracle 8的Concept手册中介绍: 1. 索引必须包含所有查询中参考到的列. 2. ...
- oracle查看索引所在表空间及索引重建
select index_name,tablespace_name from dba_indexes where index_name='INDEX_PS'; 移动 alter index INDEX ...
- mysql联合索引查找过程_(MYSQL)回表查询原理,利用联合索引实现索引覆盖
一.什么是回表查询? 这先要从InnoDB的索引实现说起,InnoDB有两大类索引: 聚集索引(clustered index) 普通索引(secondary index) InnoDB聚集索引和普通 ...
- mysql主键创建非聚集索引_什么是聚集索引,非聚集索引,索引覆盖,回表,索引下推...
聚集索引 我们先建如下的一张表 CREATE TABLE `student` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '学号',`name` var ...
最新文章
- 虚拟机ubuntu/pytorch/python出现killed已杀死
- C++ 中的 new/delete 和 new[]/delete[]
- 《剑指offer》二叉树的下一个节点
- O(n* (logn)^2 )的Shell排序——转自Matrix67的博客
- 因策划进军餐饮等虚假营销 TikTok前营销主管被开除
- string的基本用法
- Centos7的iso everything与DVD以及Live的区别
- 鸿蒙 OS 2.0 来了!值得开发者关注的是什么?
- 形式验证进阶 chipdriver_【饥荒进阶】烹饪基础:全食材系数详解-五耀整理
- 整理并记录电压比较器
- OneNote制作计划表
- VBoxGuestAdditions加载不了
- windows桌面股票价格软件
- artDialog | 经典的网页对话框组件
- 【NOIP提高组五校联考】挖金矿
- Arduino Uno 实验11——MQ-3酒精乙醇传感器模块
- Python 分类问题研究-Fisher线性判别
- python爬虫爬取网页壁纸图片(《底特律:变人》)
- 解决 HTTP/2 stream 1 was not closed cleanly before end of the underlying stream
- java 块注释_java的注释