组合索引

提到组合索引,大家都知道“最左前缀”原则。例如,创建索引 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 创建覆盖索引_Mysql覆盖索引 covering index 或者 index coverage相关推荐

  1. mysql 创建覆盖索引_MySql覆盖索引

    mysql的innodb引擎通过搜索树方式实现索引,索引类型分为主键索引和二级索引(非主键索引),主键索引树中,叶子结点保存着主键即对应行的全部数据:而二级索引树中,叶子结点保存着索引值和主键值,当使 ...

  2. mysql高效索引覆盖索引_MySQL高效索引:覆盖索引

    原标题:MySQL高效索引:覆盖索引 作者:踏雪无痕 cnblogs.com/chenpingzhao/p/4776981.html 概念 如果索引包含所有满足查询需要的数据,则该索引称为覆盖索引(C ...

  3. mysql 创建唯一索引_Mysql普通索引和唯一索引的选择分析

    假设一个用户管理系统,每个人注册都有一个唯一的手机号,而且业务代码已经保证了不会写入两个重复的手机号.如果用户管理系统需要按照手机号查姓名,就会执行类似这样的 SQL 语句: select name ...

  4. mysql按升序创建索引_MySQL建立索引的基础规则

    1.mysql索引(基础与规则) 索引规则: 一.MySQL建表,字段需设置为非空,需设置字段默认值. 二.MySQL建表,字段需NULL时,需设置字段默认值,默认值不为NULL. 三.MySQL建表 ...

  5. mysql innerdb 索引_mysql innodb索引原理

    聚集索引(clustered index) innodb存储引擎表是索引组织表,表中数据按照主键顺序存放.其聚集索引就是按照每张表的主键顺序构造一颗B+树,其叶子结点中存放的就是整张表的行记录数据,这 ...

  6. mysql的联合索引_mysql联合索引

    联合索引 概念 联合索引又叫复合索引,即一个覆盖表中两列或者以上的索引,例如: index_name(column a,column b) 1 创建方式 执行alter table语句时创建 alte ...

  7. mysql 索引_MySQL之索引

    索引查找算法BTREE BTREE查找算法演变B-TREE :普通 BTREE,平衡多路查找树(B-Tree)B+TREE :叶子节点双向指针B++TREE(B*TREE):枝节点的双向指针 普通B- ...

  8. mysql联合索失效_mysql 联合索引生效的条件、索引失效的条件

    1.联合索引失效的条件 联合索引又叫复合索引.两个或更多个列上的索引被称作复合索引. 对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分.例如索引 ...

  9. mysql联合索失效_mysql联合索引注意事项,解决为啥联合索引无效的问题

    在数据查询的时候合理利用索引才更好地提高查询效率.今天遇到一个数据量不算太大(1000万左右)的表,但是查询特别慢,建立了userid,logtype,fromid 发现索引无效,查阅相关资料后发现联 ...

最新文章

  1. python怎么做彩票概率_用Python一次性把论文作图与数据处理全部搞定!
  2. 【独家揭秘】如何获得60万开发者信任?
  3. Springboot注册Servlet
  4. mysql用户添加_MySQL用户添加
  5. 介绍一个十分好用的JQUERY图片放大镜插件
  6. ajax通用格式 jquery版本
  7. pythoncookbook和流畅的python对比_为什么你学Python效率比别人慢?因为你没有这套完整的学习资料...
  8. 学生选课系统的源码-代码布局截图
  9. 浅谈WebService的版本兼容性设计
  10. 产品技术人必备干货:产品开发流程(完整版)
  11. html5 window.game,releasing html5 games for windows 8
  12. 60w风扇用多大电容_家里的40W电风扇怎么接电容?该用多大电容?怎么判断好坏?...
  13. 使用Flink Metric Reporter 对flink任务指标进行监控
  14. python脚本之对文件进行哈希校验
  15. [洛谷 P1647]锁 --- 规律 + 二进制
  16. 流媒体技术介绍(上)
  17. html背景颜色图片,HTML背景颜色和背景图片
  18. Android 开发 有道翻译
  19. 一站解决:如何用cd-hit去低于30%的冗余(资源见百度云链接)
  20. 自媒体爆文标题的十五种独特写法

热门文章

  1. 第1周 - 课程材料
  2. python 利用 PIL 将数组值转成图片/python利用h5py、pyhdf读取.h5、.hdf文件信息
  3. iOS10适配及Xcode8配置
  4. 华科与东北大学计算机专业,华科的计算机专业在全国怎么样
  5. charCodeAt()和charAt()的使用及区别
  6. 3D Max2018菜单栏问题处理方法(无法选中子菜单) 2021-1-1
  7. 【安全牛学习笔记】存储型XSS和BEEF浏览器攻击框架
  8. 当“借钱鸡娃”遇上“躺平”一族,谁还关心在线教育死活?
  9. 数位 dp 最低位最高位之差绝对值大于2_王者荣耀 各战区 全英雄(无艾琳)省与市 最低战力查询分享 (评论有表格链接)...
  10. launchctl在Macbook管理定时任务和守护进程