mysql 创建覆盖索引_MySql覆盖索引
mysql的innodb引擎通过搜索树方式实现索引,索引类型分为主键索引和二级索引(非主键索引),主键索引树中,叶子结点保存着主键即对应行的全部数据;而二级索引树中,叶子结点保存着索引值和主键值,当使用二级索引进行查询时,需要进行回表操作。
1.覆盖索引
CREATE TABLE `user_table` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(255) NOT NULL,
`password` varchar(255) DEFAULT NULL,
`age` int(11) unsigned Not NULL,
PRIMARY KEY (`id`),
key (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
语句A
select id from user_table where username = 'xxx'
执行该语句, 因为username索引上包含主键值所以直接返回
语句B
select password form user_table where username = 'xxx'
执行该语句,查询到username索引上的主键值, 然后再根据主键值回表查询出password。
由上可知当select的列和where的列都在索引上的时候就不需要进行回表操作。
所以我们可以新建username和password的联合索引增加查询效率。
2.联合索引
通俗理解:
利用索引中的附加列,您可以缩小搜索的范围,但使用一个具有两列的索引 不同于使用两个单独的索引。复合索引的结构与电话簿类似,人名由姓和名构成,电话簿首先按姓氏对进行排序,然后按名字对有相同姓氏的人进行排序。如果您知道姓,电话簿将非常有用;如果您知道姓和名,电话簿则更为有用,但如果您只知道名不姓,电话簿将没有用处。
所以说创建复合索引时,应该仔细考虑列的顺序。对索引中的所有列执行搜索或仅对前几列执行搜索时,复合索引非常有用;仅对后面的任意列执行搜索时,复合索引则没有用处。
最左前缀原则
以最左边的为起点任何连续的索引都能匹配上
联合索引本质:
当创建(a,b,c)联合索引时,相当于创建了(a)单列索引,(a,b)联合索引以及(a,b,c)联合索引
想要索引生效的话,只能使用 a和a,b和a,b,c三种组合;当然,我们上面测试过,a,c组合也可以,但实际上只用到了a的索引,c并没有用到!
2.索引下推
现有联合索引(username, age)
语句C
select * from user_table where username like '张%' and age > 10
我们判断有两种情况
先在索引中查询出以张开头的索引然后进行回表操作过滤出年龄大于10的数据
直接所以中查询出以张开头的和年龄大于10的索引在进行回表操作
很明显第二种回表的数据更小,这就是索引下推
注意点
1.innodb引擎的表,索引下推只能用于二级索引。就像之前提到的,innodb的主键索引树叶子结点上保存的是全行数据,所以这个时候索引下推并不会起到减少查询全行数据。
2.索引下推一般可用于所求查询字段(select列)不是/不全是联合索引的字段,查询条件为多条件查询且查询条件子句(where/order by)字段全是联合索引。
假设表t有联合索引(a,b),下面语句可以使用索引下推提高效率
select * from t where a > 2 and b > 10;
mysql 创建覆盖索引_MySql覆盖索引相关推荐
- mysql 创建覆盖索引_Mysql覆盖索引 covering index 或者 index coverage
组合索引 提到组合索引,大家都知道"最左前缀"原则.例如,创建索引 idx_name_age (name,age) ,通常情况下,where age=50 或者 where age ...
- mysql高效索引覆盖索引_MySQL高效索引:覆盖索引
原标题:MySQL高效索引:覆盖索引 作者:踏雪无痕 cnblogs.com/chenpingzhao/p/4776981.html 概念 如果索引包含所有满足查询需要的数据,则该索引称为覆盖索引(C ...
- mysql 创建唯一索引_Mysql普通索引和唯一索引的选择分析
假设一个用户管理系统,每个人注册都有一个唯一的手机号,而且业务代码已经保证了不会写入两个重复的手机号.如果用户管理系统需要按照手机号查姓名,就会执行类似这样的 SQL 语句: select name ...
- mysql按升序创建索引_MySQL建立索引的基础规则
1.mysql索引(基础与规则) 索引规则: 一.MySQL建表,字段需设置为非空,需设置字段默认值. 二.MySQL建表,字段需NULL时,需设置字段默认值,默认值不为NULL. 三.MySQL建表 ...
- mysql innerdb 索引_mysql innodb索引原理
聚集索引(clustered index) innodb存储引擎表是索引组织表,表中数据按照主键顺序存放.其聚集索引就是按照每张表的主键顺序构造一颗B+树,其叶子结点中存放的就是整张表的行记录数据,这 ...
- mysql的联合索引_mysql联合索引
联合索引 概念 联合索引又叫复合索引,即一个覆盖表中两列或者以上的索引,例如: index_name(column a,column b) 1 创建方式 执行alter table语句时创建 alte ...
- mysql 索引_MySQL之索引
索引查找算法BTREE BTREE查找算法演变B-TREE :普通 BTREE,平衡多路查找树(B-Tree)B+TREE :叶子节点双向指针B++TREE(B*TREE):枝节点的双向指针 普通B- ...
- mysql联合索失效_mysql 联合索引生效的条件、索引失效的条件
1.联合索引失效的条件 联合索引又叫复合索引.两个或更多个列上的索引被称作复合索引. 对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分.例如索引 ...
- mysql联合索失效_mysql联合索引注意事项,解决为啥联合索引无效的问题
在数据查询的时候合理利用索引才更好地提高查询效率.今天遇到一个数据量不算太大(1000万左右)的表,但是查询特别慢,建立了userid,logtype,fromid 发现索引无效,查阅相关资料后发现联 ...
最新文章
- Haar Adaboost 视频车辆检测代码和样本
- 深入理解JVM虚拟机(四):Class类文件结构(一)
- window下不用安装虚拟机,也可以玩转linux,玩转最新redis
- 三、入门实例----基于注解
- Matlab | Matlab从入门到放弃(4)——样本均值
- 最强鸿蒙系统txt_鸿蒙系统升级时间确认,哪些手机有望成为首批“宠儿”?
- python中main方法的用法_python __main__和__init__正确用法
- java中的provide,vue3 provide ref
- 5G关键技术:大规模多天线技术现状及研究点介绍
- linux disk 清除数据,如何在Linux中使用TestDisk恢复已删除的文件
- C# WPF 利用NPOI读写Excel文件
- win7桌面运行html,手把手教你win7电脑如何运行config的操作教程
- 一阶广义差分模型_微波射频差分探针去嵌入理论研究
- bug:刷机卡Logo界面,adb shell 报- exec '/system/bin/sh' failed: No such file or directory (2) -
- 计算机中学期末考试,[探析我国中学计算机教育]计算机基础大一考试题
- IE7 - 千呼万唤始出来
- 理论力学---约束及其分类
- 分块详解(优雅的暴力)
- 火遍抖音的3D旋转特效
- 牛客小白月赛61_C-小喵觅食题解