Mysql覆盖索引 covering index 或者 index coverage
组合索引
提到组合索引,大家都知道“最左前缀”原则。例如,创建索引 idx_name_age (name,age) ,通常情况下,where age=50 或者 where age>50 之类的,是不会使用到idx_a_b的。那有没有特殊情况呢?
假设表是:
CREATE TABLE users
(
id
int(10) unsigned NOT NULL AUTO_INCREMENT,
name
varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
email
varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
password
varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
remember_token
varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
created_at
timestamp NULL DEFAULT NULL,
updated_at
timestamp NULL DEFAULT NULL,
age
int(11) DEFAULT NULL,
PRIMARY KEY (id
),
UNIQUE KEY users_email_unique
(email
),
KEY idx_name_age
(name
,age
)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
覆盖索引
innodb存储引擎支持覆盖索引(covering index),或称索引覆盖(index coverage),即从辅助索引中就能查到的记录,而不需要查询聚集索引中的记录。
使用覆盖索引的好处是辅助索引不包含整行记录的所有信息,故其大小要远小于聚集索引,因此可以减少大量的IO操作。
几个sql语句的explain
- explain SELECT name FROM test.users where age>50
possible_keys是null,表示确实没啥索引可用。
key却是idx_name_age,表示优化器出动了,它选择了idx_name_age这个二级索引。
注意select的字段是name,在idx_name_age这个二级索引中就能完成where的查找以及拿到select 的字段 name
- explain SELECT name,age FROM test.users where age>50
同上
- explain SELECT name,age,id FROM test.users where age>50
同上(注意二级索引都包含了主键[ 样例表主键字段是id]以便通过主键去聚簇索引查找其他字段。但是显然上述SQL语句并不需要,因为要select的字段在idx_name_age里都有了。)
- explain SELECT name,age,id,email FROM test.users where age>50
这次没有使用到idx_name_age,因为要select的字段包含了email,在idx_name_age里面是没有的
- explain SELECT count(1) FROM test.users where age>50
对于(a,b)这样的联合索引,对于b列的查询条件进行统计,如果是覆盖索引的,优化器也会选择该联合索引。
Mysql覆盖索引 covering index 或者 index coverage的更多相关文章
- mysql覆盖索引(屌的狠,提高速度)
话说有这么一个表: CREATE TABLE `user_group` ( `id` int(11) NOT NULL auto_increment, `uid` int(11) NOT NULL, ...
- mysql覆盖索引
话说有这么一个表: CREATE TABLE `user_group` ( `id` int(11) NOT NULL auto_increment, `uid` int(11) NOT NU ...
- mysql覆盖索引与回表
mysql覆盖索引与回表 Harri2012关注 62019.07.28 11:14:15字数 1,292阅读 77,322 select id,name where name='shenjian' ...
- Mysql覆盖索引与延迟关联
延迟关联:通过使用覆盖索引查询返回需要的主键,再根据主键关联原表获得需要的数据. 为什innodb的索引叶子节点存的是主键,而不是像myisam一样存数据的物理地址指针? 如果存的是物理地址指针不 ...
- MYSQL的索引类型:PRIMARY, INDEX,UNIQUE,FULLTEXT,SPAIAL 有什么区别?各适用于什么场合?
一.介绍一下索引的类型 Mysql常见索引有:主键索引.唯一索引.普通索引.全文索引.组合索引PRIMARY KEY(主键索引) ALTER TABLE `table_name` ADD PRIMAR ...
- MySQL 覆盖索引
通常大家都会根据查询的WHERE 条件来穿件合适的索引,不过这只是索引优化的一个方面.设计优秀的索引应该考虑到整个查询,而不单单是WHERE 条件部分.索引确实是一种查找数据的高效方式,但是MySQL ...
- mysql覆盖索引详解
覆盖索引的定义: 如果一个索引包含(或覆盖)所有需要查询的字段的值,称为‘覆盖索引’.即只需扫描索引而无须回表. 只扫描索引而无需回表的优点: 1.索引条目通常远小于数据行大小,只需要读取索引, ...
- MYSQL的索引类型:PRIMARY, INDEX,UNIQUE,FULLTEXT,SPAIAL 区别与使用场合
normal 普通索引 unique 唯一的,不允许重复的索引 该字段信息保证不会重复例如身份证号用作索引时,可设置为unique full textl 全文搜索的索引 FULLTEXT 用于搜索 ...
- 理解MySQL数据库覆盖索引 (转)
http://www.cnblogs.com/zl0372/articles/mysql_32.html 话说有这么一个表: CREATE TABLE `user_group` ( `id` int( ...
随机推荐
- jQuery 属性操作方法(五)
方法 描述 addClass() 向匹配的元素添加指定的类名. attr() 设置或返回匹配元素的属性和值. hasClass() 检查匹配的元素是否拥有指定的类. html() 设置或返回匹配的元素 ...
- php echo和print_r和var_dump的区别
echo -- 适合打印单数据 整型 字符串 浮点型 print_r -- 适合打印符合数据 数组 资源 对象 var_dump -- 适合调试变量打印特许的类型 如BOOL NULL 不仅能把值打印 ...
- Spark源码分析 之 Driver和Excutor是怎么跑起来的?(2.2.0版本)
今天抽空回顾了一下Spark相关的源码,本来想要了解一下Block的管理机制,但是看着看着就回到了SparkContext的创建与使用.正好之前没有正式的整理过这部分的内容,这次就顺带着回顾一下. S ...
- Effective Java 第三版——18. 组合优于继承
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- msgpack库的神奇用法
一般来说,我们会把头部和实际消息分开定义,因为内部工作的worker之间发送消息有些额外的字段,这些字段不属于实际的消息.这时候我们会把worker消息中一个字段定义为interface{}或者obj ...
- BaseServer的介绍
服务器类型 5种类型:BaseServer,TCPServer,UnixStreamServer,UDPServer,UnixDatagramServer.注意:BaseServer不直接对外服务. ...
- hdf5 AttributeError: 'UnImplemented' object has no attribute 'read'
问题现象:最近在用pandas分析数据时,用hdf5存储结果,当我监听不同文件时,多个进程同时写入hdf5(save到不同group)时,报hdf5 AttributeError: 'UnImplem ...
- 【读书笔记】【深入理解ES6】#4-扩展对象的功能性
对象类别 ES6规范清晰定义了每一个类别的对象. 普通(Ordinary)对象 具有JS对象所有的默认内部行为 特异(Exotic)对象 具有某些与默认行为不符的内部行为 标准(Standard)对象 ...
- Django--权限组件
创建组件 需求分析: 创建独立app, rbac ##注意: app创建后需要注册到setting.py中 INSTALLED_APPS = [ 'django.contrib.admin', 'dj ...
- 让你的Capslock键变废为宝
Capslock 键的劣性 如果你是 Windows 系统用户,就会发现,很多时候我们是用不到 Capslock 键的.Capslock 键是切换大小写的锁定,而在平常工作中,只要摁住 Shift 键 ...