昨天同事关于军规里的一条mysql索引的问题咨询我,才发现自己也不太了解组合索引的规则。于是来记录一下:

【推荐】如果有order by的场景,请注意利用索引的有序性。order by 最后的字段是组合索引的一部分,并且放在索引组合顺序的最后,避免出现file_sort的情况,影响查询性能。

正例:where a=? and b=? order by c; 索引:a_b_c

反例:索引中有范围查找,那么索引有序性无法利用,如:WHERE a>10 ORDER BY b; 索引a_b无法排序。

解释:order by的排序原理

1.利用索引的有序性获取有序数据

2.利用内存/磁盘文件排序获取结果

1) 双路排序:是首先根据相应的条件取出相应的排序字段和可以直接定位行数据的行指针信息,然后在sort buffer 中进行排序。

2)单路排序:是一次性取出满足条件行的所有字段,然后在sort buffer中进行排序。

组合索引的有序性和最左前缀原理

【强制】理解组合索引最左前缀原则,避免重复建设索引,如果建立了(a,b,c),相当于建立了(a), (a,b), (a,b,c)

假设有索引(A,B)

mysql创建组合索引的规则是首先会对复合索引的最左边的,也就是第一个A字段的数据进行排序,在第一个字段的排序基础上,然后再对后面第二个的B字段进行排序。其实就相当于实现了类似 order by A B这样一种排序规则。

第一个A字段是绝对有序的,而第二字段就是无序的了。所以通常情况下,直接使用第二个B字段进行条件判断是用不到索引的

那么什么时候才能用到呢?

当然是B字段的索引数据也是有序的情况下才能使用。

什么时候才是有序的呢?

只有在A字段是等值匹配的情况下,B才是有序的。

组合索引查询的各种场景

有 Index (A,B,C) ——组合索引多字段是有序的,并且是个完整的BTree 索引。

下面条件可以用上该组合索引查询:

A>5

A=5 AND B>6

A=5 AND B=6 AND C=7

A=5 AND B IN (2,3) AND C>5

下面条件将不能用上组合索引查询:

B>5 ——查询条件不包含组合索引首列字段

B=6 AND C=7 ——查询条件不包含组合索引首列字段

下面条件将能用上部分组合索引查询:

A>5 AND B=2 ——当范围查询使用第一列,查询条件仅仅能使用第一列

A=5 AND B>6 AND C=2 ——范围查询使用第二列,查询条件仅仅能使用前二列

组合索引排序的各种场景

有组合索引 Index(A,B)。

下面条件可以用上组合索引排序:

ORDER BY A——首列排序

A=5 ORDER BY B——第一列过滤后第二列排序

ORDER BY A DESC, B DESC——注意,此时两列以相同顺序排序

A>5 ORDER BY A——数据检索和排序都在第一列

下面条件不能用上组合索引排序:

ORDER BY B ——排序在索引的第二列

A>5 ORDER BY B ——范围查询在第一列,排序在第二列

A IN(1,2) ORDER BY B ——理由同上

ORDER BY A ASC, B DESC ——注意,此时两列以不同顺序排序

建议

如果对有没有用上索引有疑惑可以写完sql以后 用explain 来运行一下sql

可以更有利于理解sql的执行过程

Mysql索引是有序的吗_mysql组合索引的有序性转相关推荐

  1. mysql 组合主键索引_mysql 组合索引带主键ID的问题

    场景: mysql 5.7 某表 t_apply_info 上的2个索引,一个组合索引带了 主键字段 ID,另一个是同字段的单列索引 例如: KEY idx_1 (apply_serial_no,id ...

  2. oracle 主键_mysql 组合索引带主键ID的问题

    场景: mysql 5.7 某表 t_apply_info 上的2个索引,一个组合索引带了 主键字段 ID,另一个是同字段的单列索引 例如: KEY idx_1 (apply_serial_no,id ...

  3. mysql组合索最左_MySQL组合索引和最左匹配原则

    可以看到该查询使用到了索引 EXPLAIN SELECT * FROM student WHERE id = 2 AND name = 'defghijk' and age = 8; 可以看到该查询使 ...

  4. mysql navicat 组合索引_mysql组合索引与字段顺序

    很多时候,我们在mysql中创建了索引,但是某些查询还是很慢,根本就没有使用到索引! 一般来说,可能是某些字段没有创建索引,或者是组合索引中字段的顺序与查询语句中字段的顺序不符. 看下面的例子: 假设 ...

  5. mysql组合索引存储_Mysql - 组合索引的B+树存储结构(最左前缀原理)

    Mysql的B+树索引在单列索引上比较好理解,结构如下: 那组合索引的B+树存储结构是什么样的呢,为什么会有最左前缀原理,看了很多帖子找到了答案 数据表 B+树结构 b c d设置组合索引 对于联合索 ...

  6. mysql范围索引_mysql 组合索引中对范围的查询

    建立表: CREATE TABLE `ygzt_test` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `a` int(11) NOT NU ...

  7. mysql创建索引要加index吗_MySql创建索引,添加索引

    alter table 数据库add index 索引名称(数据库字段名称) PRIMARY KEY(主键索引) ALTER TABLE `table_name` ADD PRIMARY KEY ( ...

  8. mysql索引过多为什么会慢_mysql – 为什么索引使这个查询更慢?

    摘要 问题是由于b-trees的性质,字段不适合索引. 说明 假设你有一张表有500,000个掷硬币的结果,其中抛掷是1(头)或0(尾): CREATE TABLE toss ( id int NOT ...

  9. mysql复合索引可以建多少个_MySQL 复合索引

    一. 1.索引越少越好,在修改数据时,第个索引都要进行更新,降低写速度. 2.最窄的字段放在键的左边 3.避免file sort排序,临时表和表扫描. 二.复合索引的建立原则: 如果您很可能仅对一个列 ...

最新文章

  1. [Python]网络爬虫(四):Opener与Handler的介绍和实例应用
  2. Artech的MVC4框架学习——第三章controller的激活
  3. HTTP系列学习(笔记一):一文带你详解HTTP协议
  4. log4j mysql_log4j写入mysql数据库 | 学步园
  5. 不少程序员都会碰到的三个面试题
  6. 详解Python序列解包(4)
  7. 服务自动拉起,定时日志清理,数据统计的shell脚本
  8. DataGridView下拉框动态赋值以及事件处理
  9. WiMAX版图不止3G
  10. python---windows中的文件路径书写的错误
  11. C/C++与Fortan混编
  12. Android速度仪表盘,速度评级小车动画(模仿电脑版360宽带测速器)
  13. 使用STN的行人属性识别
  14. 七、训练自己的声学模型
  15. Matlab 向量的处理
  16. Python爬取某宝菠萝数据,并可视化分析销量
  17. u-boot v2018.01 启动流程分析
  18. 小米平板4软件提取包_小米三大法宝:软件、硬件和服务;以及他的4条成功经验|小米手机|智能手机|手机...
  19. 破解G*L**d2021.1.3
  20. iphone开发每日一练1【2011-09-30】

热门文章

  1. mysql增数据语句_Mysql 数据增删改查语句
  2. 数据处理工具(一)——Matplotlib
  3. QT实现图像处理-傅立叶变换、傅立叶反变换、平滑、锐化与模板匹配
  4. Taro+react开发(86):资源文件处理
  5. React开发(138):ant design学习指南之anchor处理
  6. 前端学习(2932):vue中的v-show
  7. 前端学习(2926):vue改变样式2
  8. [html] html5点击返回键怎样不让它返回上一页?
  9. [html]说说页面中字体渲染规则是怎样的?会有哪些因素影响字体的渲染?
  10. [html] HTML5的Server-Sent和WebSocket有什么区别?