组合索引

提到组合索引,大家都知道“最左前缀”原则。例如,创建索引 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的更多相关文章

  1. mysql覆盖索引(屌的狠,提高速度)

    话说有这么一个表: CREATE TABLE `user_group` ( `id` int(11) NOT NULL auto_increment, `uid` int(11) NOT NULL, ...

  2. mysql覆盖索引

    话说有这么一个表: CREATE TABLE `user_group` (   `id` int(11) NOT NULL auto_increment,   `uid` int(11) NOT NU ...

  3. mysql覆盖索引与回表

    mysql覆盖索引与回表 Harri2012关注 62019.07.28 11:14:15字数 1,292阅读 77,322 select id,name where name='shenjian' ...

  4. Mysql覆盖索引与延迟关联

    延迟关联:通过使用覆盖索引查询返回需要的主键,再根据主键关联原表获得需要的数据.   为什innodb的索引叶子节点存的是主键,而不是像myisam一样存数据的物理地址指针? 如果存的是物理地址指针不 ...

  5. MYSQL的索引类型:PRIMARY, INDEX,UNIQUE,FULLTEXT,SPAIAL 有什么区别?各适用于什么场合?

    一.介绍一下索引的类型 Mysql常见索引有:主键索引.唯一索引.普通索引.全文索引.组合索引PRIMARY KEY(主键索引) ALTER TABLE `table_name` ADD PRIMAR ...

  6. MySQL 覆盖索引

    通常大家都会根据查询的WHERE 条件来穿件合适的索引,不过这只是索引优化的一个方面.设计优秀的索引应该考虑到整个查询,而不单单是WHERE 条件部分.索引确实是一种查找数据的高效方式,但是MySQL ...

  7. mysql覆盖索引详解

    覆盖索引的定义: 如果一个索引包含(或覆盖)所有需要查询的字段的值,称为‘覆盖索引’.即只需扫描索引而无须回表. 只扫描索引而无需回表的优点:    1.索引条目通常远小于数据行大小,只需要读取索引, ...

  8. MYSQL的索引类型:PRIMARY, INDEX,UNIQUE,FULLTEXT,SPAIAL 区别与使用场合

    normal 普通索引   unique 唯一的,不允许重复的索引 该字段信息保证不会重复例如身份证号用作索引时,可设置为unique full textl 全文搜索的索引 FULLTEXT 用于搜索 ...

  9. 理解MySQL数据库覆盖索引 (转)

    http://www.cnblogs.com/zl0372/articles/mysql_32.html 话说有这么一个表: CREATE TABLE `user_group` ( `id` int( ...

随机推荐

  1. 推荐!手把手教你使用Git(转载)

    转载地址http://blog.jobbole.com/78960/,涂根华的博客. Git基本常用命令如下: mkdir:         XX (创建一个空目录 XX指目录名) pwd:      ...

  2. linux 实时同步inotify

    #实时同步inotify 1.inotify简介inotify是一种强大的,细腻度的,异步的文件系统事件监控机制,linux内核从2.6.13起,加入了inotify支持,通过INOTIFY可以监控文 ...

  3. K:树与二叉树

    相关介绍:  树(英语:tree)是一种抽象数据类型(ADT)或是作这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合.它是由n(n>0)个有限节点组成的一个具有层次关系的集合.把它 ...

  4. MySQL并发复制系列二:多线程复制 2016

    并发复制(Parallel Replication) 系列二: Enhanced Multi-threaded Slaves作者:沃趣科技MySQL数据库工程师  麻鹏飞 首先梳理下传统MySQL/M ...

  5. 【读书笔记】【深入理解ES6】#5-解构:使数据访问更便捷

    ES6为对象和数组都添加了解构功能,将数据解构打散的过程变得更简单,可以从打散后更小的部分中获取所需信息. 对象解构 let node = { type: "Identifier" ...

  6. Zabbix实战-简易教程--正则(Regxp)

    一.正则表达式(Regx) 1.概述 正则表达式概念就不解释了.请参考:https://en.wikipedia.org/wiki/Regular_expression#POSIX_extended ...

  7. Android基础_一次上传多张图片

    获取权限 <uses-permission android:name="android.permission.CAMERA"/> <uses-permission ...

  8. springboot之集成mybatis mongo shiro druid redis jsp

    闲来无事,研究一下spingboot  发现好多地方都不一样了,第一个就是官方默认不支持jsp  于是开始狂找资料  终于让我找到了 首先引入依赖如下: <!-- tomcat的支持.--> ...

  9. python科学计算之numpy

    1.np.logspace(start,stop,num): 函数表示的意思是;在(start,stop)间生成等比数列num个 eg: import numpy as np print np.log ...

  10. MongoDB入门学习笔记之简介与安装配置

    一.MongoDB简介 1.文档数据库 MongoDB是一款开源的文档型非关系数据库,具有高性能.高可靠性和自动扩展等特点.MongoDB中的每一条记录是一个文档,其数据存储结构为键/值对,类似JSO ...