MySQL复合索引(联合索引)原理分析及使用
MySQL索引分类
聚簇索引:将数据存储与索引放到了一块,找到索引也就找到了数据。在InnoDB中,只有主键索引是聚簇索引,如果没有主键,则挑选一个唯一键建立聚簇索引。如果没有唯一键,则隐式的生成一个键来建立聚簇索引。
非聚簇索引:将数据存储于索引分开结构,索引结构的叶子节点指向了数据的对应行。在InnoDB中,在聚簇索引之上创建的索引称之为辅助索引,辅助索引访问数据总是需要二次查找,非聚簇索引都是辅助索引,像复合索引、前缀索引、唯一索引,辅助索引叶子节点存储的不再是行的物理位置,而是主键值。
复合索引
MySQL可以在多个列上建立索引,这种索引叫做复合索引,是一种非聚簇索引。复合索引的使用原则:
最左前缀原则:在复合索引中,如果想要命中索引,需要按照建立索引时的字段顺序挨个使用,否则无法命中索引。mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。
覆盖索引:SQL只需要通过索引就可以返回查询所需要的数据,而不必通过非聚簇索引查到主键之后再去查询数据,避免二次查找。
举个栗子,假设表有4个列:
id, name, age, sex
主键id,普通索引(name,age),那么在InnoDB里实际上包含2个索引(即2个B+树):
id -> (name, age, sex); // 主索引,每个InnoDB的表必然包含一个主索引,主索引必然包含所有的列
(name, age) -> id; // 普通索引(name, age)
我们执行查询:
SELECT id FROM table WHERE name = ? AND age = ?
只要使用(name,age)索引就可以了,不会再使用主索引。但如果查询是:
SELECT id, sex FROM table WHERE name = ? AND age = ?
先使用(name,age)索引查到 id 后,再会查主索引查到 sex,所以会比刚才多查一次,二次查找。
可以将索引(name,age)改为(name,age,sex),这样查(name,age)可以直接查到 id 和 sex,不需要再查主索引了。
MySQL复合索引(联合索引)原理分析及使用相关推荐
- mysql复合索引(联合索引)的使用场景
什么是联合索引? 联合索引又叫复合索引.对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分.例如索引是key index (a,b,c). 可以支 ...
- mysql复合索引使用场景_mysql复合索引(联合索引)的使用场景
什么是联合索引? 联合索引又叫复合索引.对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分.例如索引是key index (a,b,c). 可以支 ...
- mysql复合索引的应用场景_mysql复合索引(联合索引)的使用场景
什么是联合索引? 联合索引又叫复合索引.对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分.例如索引是key index (a,b,c). 可以支 ...
- MySQL中的联合索引学习教程
MySQL中的联合索引学习教程 这篇文章主要介绍了MySQL中的联合索引学习教程,其中谈到了联合索引对排序的优化等知识点,需要的朋友可以参考下 联合索引又叫复合索引.对于复合索引:Mysql从左到右的 ...
- Mysql中的联合索引、前缀索引、覆盖索引
Mysql中的联合索引.前缀索引.覆盖索引 索引 索引是一种特殊的文件,它们包含着对数据表里所有记录的引用指针.更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度. 联合索引 又名复 ...
- 复合索引 /多列索引 /联合索引 /组合索引?????
复合索引 /多列索引 /联合索引 /组合索引,一个意思,不同叫法. 含有多个列字段的索引 联合索引也是一棵B+树,不同的是联合索引的键值数量不是1,而是大于等于2. 例如: 创建数据库表CREATE ...
- MYSQL主从不同步延迟原理分析及解决方案
MYSQL主从不同步延迟原理分析及解决方案 参考文章: (1)MYSQL主从不同步延迟原理分析及解决方案 (2)https://www.cnblogs.com/shishanyu/p/7977835. ...
- mysql 复合索引(联合索引) a b c的使用
本博文中所用数据版本为mysql 5.7.28 通过命令行查看 mysql版本信息如下: ~ mysql --version mysql Ver 14.14 Distrib 5.7.28, for m ...
- mysql复合索引(联合索引)用法以及最左原则
1.准备表(含23w数据) SELECT COUNT(*) FROM index_test; 2.查看索引,只有一个主键索引 3.创建联合索引(abc) ALTER TABLE index_test ...
- sql优化之:数据库索引创建原则,or/in/union与索引优化,聚集索引/非聚集索引/联合索引/索引覆盖,MySQL冗余数据的三种方案,MySQL双主一致性架构优化(来源:架构师之路)
一.一些常见的SQL实践 (1)负向条件查询不能使用索引 select * from order where status!=0 and stauts!=1 not in/not exists都不是好 ...
最新文章
- MS_SQL_获取字符串最后出现的字符串及位置
- Jupiter:Facebook的高性能job-matching服务
- Python之lambda表达式和内置函数
- private访问权限java_Java之访问权限
- linux distribution timeline
- trunk口_什么是Trunk?Trunk详解
- 我的站(艾网---城市生活新门户)重新上线了
- 使用 data URI scheme 在网页中内嵌图片[转]
- Xposed框架的安装包和卸载包的默认下载路径以及网站下载地址
- 如何让你的程序员不要厌倦工作?
- Load和Initialize的区别和使用
- kali安装网卡驱动
- 并行计算中的BSP模型
- windows使用WiFi-direct连接手机等设备
- 数学、键盘符号和时间复杂度的英语术语及表述方法(编程,标识符,按键,空间复杂度,指数,对数,模运算)
- 你想成为一个什么样的面试官?
- iOS平台手机银行App大多存安全风险漏洞
- 死亡搁浅 服务器不稳定,[收集]死亡搁浅现有bug临时解决方案
- WEB前端学习课程推荐
- 炒菜机器人的弊端_饭店用智能炒菜机器人的好处