组合索引

提到组合索引,大家都知道“最左前缀”原则。例如,创建索引 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. and,or

    where语句的and or 连接 $map['_logic'] = 'and'; $map['_logic'] = 'or';

  2. python基础(六)dict字典和文件操作open

    字典dict 使用key来标注value的数据类型,key和value是一一对应的.在字典中key是唯一的,所以字典也是无序的. #定义一个字典 dict = { 'name' : 'sylar', ...

  3. Juicer模板引擎使用笔记

    关于Juicer:Juicer 是一个高效.轻量的前端 (Javascript) 模板引擎,使用 Juicer 可以是你的代码实现数据和视图模型的分离(MVC). 除此之外,它还可以在 Node.js ...

  4. BIOS 品牌快捷键

    主板品牌 启动按键 笔记本品牌 启动按键 台式机品牌 启动按键 华硕主板 F8 联想笔记本 F12 联想台式机 F12 技嘉主板 F12 宏基笔记本 F12 惠普台式机 F12 微星主板 F11 华硕 ...

  5. ghost.py在代用JavaScript时的超时问题

    在写爬虫的时候,关于JavaScript的解析问题,我在网上找到的一个解决方案是使用ghost.py这个模块,他是一个基于webkit封装的一个客户端,可以用来解析动态页面.它的使用非常简单,它从2. ...

  6. 转JS--通过按钮直接把input或者textarea里的值复制到粘贴板里

    document.activeElement属性为HTML 5中新增的document对象的一个属性,该属性用于返回光标所在元素.当光标未落在页面中任何元素内时,属性值返回body元素. setSel ...

  7. vim 简单笔记

    vim编辑器Linux系统常用的一种编辑器  有三种模式   命令模式:插入模式:编辑模式 1 插入模式的基本操作: 从命令模式切入到插入模式只需要注意有三个字母aio就可以了  a是在当前光标后插入 ...

  8. selenium获取动态网页信息(某东)-具体配置信息

    需要安装的包: selenium 关于软件的驱动:selenium之 驱动环境配置chrome.firefox.IE 1 # encoding:utf-8 2 # Author:"richi ...

  9. 【转】TCP粘包分析

    一 .两个简单概念长连接与短连接: 1.长连接     Client方与Server方先建立通讯连接,连接建立后不断开, 然后再进行报文发送和接收. 2.短连接     Client方与Server每 ...

  10. 开发 | 小程序wx.setScreenBrightness/wx.getScreenBrightness接口测试

    前言 最近接触了微信小程序 API - wx.setScreenBrightness .wx.getScreenBrightness 接口,调用该接口可以调节并显示手机屏幕亮度数据.对于喜欢腾讯新闻. ...