MySQL索引分类

  1. 聚簇索引:将数据存储与索引放到了一块,找到索引也就找到了数据。在InnoDB中,只有主键索引是聚簇索引,如果没有主键,则挑选一个唯一键建立聚簇索引。如果没有唯一键,则隐式的生成一个键来建立聚簇索引。

  2. 非聚簇索引:将数据存储于索引分开结构,索引结构的叶子节点指向了数据的对应行。在InnoDB中,在聚簇索引之上创建的索引称之为辅助索引,辅助索引访问数据总是需要二次查找,非聚簇索引都是辅助索引,像复合索引、前缀索引、唯一索引,辅助索引叶子节点存储的不再是行的物理位置,而是主键值。

复合索引

MySQL可以在多个列上建立索引,这种索引叫做复合索引,是一种非聚簇索引。复合索引的使用原则:

  1. 最左前缀原则:在复合索引中,如果想要命中索引,需要按照建立索引时的字段顺序挨个使用,否则无法命中索引。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的顺序可以任意调整。

  2. 覆盖索引: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复合索引(联合索引)原理分析及使用相关推荐

  1. mysql复合索引(联合索引)的使用场景

    什么是联合索引? 联合索引又叫复合索引.对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分.例如索引是key index (a,b,c). 可以支 ...

  2. mysql复合索引使用场景_mysql复合索引(联合索引)的使用场景

    什么是联合索引? 联合索引又叫复合索引.对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分.例如索引是key index (a,b,c). 可以支 ...

  3. mysql复合索引的应用场景_mysql复合索引(联合索引)的使用场景

    什么是联合索引? 联合索引又叫复合索引.对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分.例如索引是key index (a,b,c). 可以支 ...

  4. MySQL中的联合索引学习教程

    MySQL中的联合索引学习教程 这篇文章主要介绍了MySQL中的联合索引学习教程,其中谈到了联合索引对排序的优化等知识点,需要的朋友可以参考下 联合索引又叫复合索引.对于复合索引:Mysql从左到右的 ...

  5. Mysql中的联合索引、前缀索引、覆盖索引

    Mysql中的联合索引.前缀索引.覆盖索引 索引 索引是一种特殊的文件,它们包含着对数据表里所有记录的引用指针.更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度. 联合索引 又名复 ...

  6. 复合索引 /多列索引 /联合索引 /组合索引?????

    复合索引 /多列索引 /联合索引 /组合索引,一个意思,不同叫法. 含有多个列字段的索引 联合索引也是一棵B+树,不同的是联合索引的键值数量不是1,而是大于等于2. 例如: 创建数据库表CREATE ...

  7. MYSQL主从不同步延迟原理分析及解决方案

    MYSQL主从不同步延迟原理分析及解决方案 参考文章: (1)MYSQL主从不同步延迟原理分析及解决方案 (2)https://www.cnblogs.com/shishanyu/p/7977835. ...

  8. mysql 复合索引(联合索引) a b c的使用

    本博文中所用数据版本为mysql 5.7.28 通过命令行查看 mysql版本信息如下: ~ mysql --version mysql Ver 14.14 Distrib 5.7.28, for m ...

  9. mysql复合索引(联合索引)用法以及最左原则

    1.准备表(含23w数据) SELECT COUNT(*) FROM index_test; 2.查看索引,只有一个主键索引 3.创建联合索引(abc) ALTER TABLE index_test ...

  10. sql优化之:数据库索引创建原则,or/in/union与索引优化,聚集索引/非聚集索引/联合索引/索引覆盖,MySQL冗余数据的三种方案,MySQL双主一致性架构优化(来源:架构师之路)

    一.一些常见的SQL实践 (1)负向条件查询不能使用索引 select * from order where status!=0 and stauts!=1 not in/not exists都不是好 ...

最新文章

  1. MS_SQL_获取字符串最后出现的字符串及位置
  2. Jupiter:Facebook的高性能job-matching服务
  3. Python之lambda表达式和内置函数
  4. private访问权限java_Java之访问权限
  5. linux distribution timeline
  6. trunk口_什么是Trunk?Trunk详解
  7. 我的站(艾网---城市生活新门户)重新上线了
  8. 使用 data URI scheme 在网页中内嵌图片[转]
  9. Xposed框架的安装包和卸载包的默认下载路径以及网站下载地址
  10. 如何让你的程序员不要厌倦工作?
  11. Load和Initialize的区别和使用
  12. kali安装网卡驱动
  13. 并行计算中的BSP模型
  14. windows使用WiFi-direct连接手机等设备
  15. 数学、键盘符号和时间复杂度的英语术语及表述方法(编程,标识符,按键,空间复杂度,指数,对数,模运算)
  16. 你想成为一个什么样的面试官?
  17. iOS平台手机银行App大多存安全风险漏洞
  18. 死亡搁浅 服务器不稳定,[收集]死亡搁浅现有bug临时解决方案
  19. WEB前端学习课程推荐
  20. 炒菜机器人的弊端_饭店用智能炒菜机器人的好处

热门文章

  1. 单个form表单内,不同情况显示的不同选项的单选框或多选框的情况下,判断单选框是否存在未选择一个选项情况,并进行提示。
  2. 查询数据库表字段属性
  3. deli考勤机3960操作手册
  4. 100个优秀jQuery插件精选
  5. Everything 命令行 详细参数集
  6. matlab---矩阵运算函数
  7. 模拟cmos集成电路(7)
  8. Java压缩字符串的方法收集
  9. RN-原生混合开发之热更新
  10. java二维数组添加数据_Java自学路线图