2021-06-07 mysql索引 + 排序
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021-06-07 mysql索引 + 排序相关的知识,希望对你有一定的参考价值。
参考技术A
btree效率低于hash,单更普遍
hash缺点: (推荐用于单列索引)
(1)Hash 索引仅仅能满足"=","IN"和"<=>"查询,不能使用范围查询。
(2)Hash 索引无法被用来避免数据的排序操作。
(3)Hash 索引不能利用部分索引键(组合索引)查询。
(4)Hash 索引在任何时候都不能避免表扫描。
(5)Hash 索引遇到大量Hash值相等的情况后性能并不一定就会比B-Tree索引高。
5.7以后合并索引单表,or
1.多列联合索引和复核索引的对比
多列联合索引 占空间,更新插入费时
复合索引 注重顺序,第一个索引列紧跟where,不是则不命中(但是复核索引所有列都出现不需要顺序全部命中)
mysql会自己根据优化策略觉得走多单列还是复合
(若三列,建一个复核,第二第三建单列,最大情况命中)
Mysql索引优化2
理想的索引
- 查询频繁
- 区分度高
- 长度小
- 尽量能覆盖常用查询字段
索引与排序
- 对于覆盖索引,直接在索引上查询时,就是有顺序的,using index
- 在innodb引擎中,沿着索引字段排序自然是有序的
- 在myisam引擎中,沿着索引字段排序,但取出来的字段有非索引字段,并不是索引->回行,索引->回行,而是一次性取出所有数据,再进行排序,explain这样的sql语句时,extra中就会出现using filesort
- 要想办法避免filesort,尽可能的利用索引来排序
- where a > 3 order by b 假设a列和b列都是独立索引,这样的sql explain中也会有using filesort, 因为a,b都是独立索引,在查询中只能用到a对应的索引,order by b时无法使用索引
Explain解释
- select type字段
- simple (不含子查询)
- primary(含有子查询或派生查询)
- subquery (非from子查询)
- derived (from型子查询)
- union
- union result
- type字段 分析查询的关键字段
- all < index < range < ref < eq_ref < (const, system, null)
- all 全表扫描
- index 扫描索引树上全部的索引节点
- range 根据索引做范围的扫描
- ref 通过索引列,直接引用到某些数据行
- eq_ref 通过索引列,直接引用一行数据,常用于连接中
- 一般按照主键查询时,易出现const, system 当查询不经过表时会出现null
- table字段
- 真实的表名
- 临时表 如as tmp
- derived 如from型子查询
- null 不使用表
- ref字段
- possible key字段
- key 字段
- key len 字段
- rows 字段
- extra 字段
- using index 用到了索引覆盖
- using where 光靠索引定位不了,还得where判断一下
- using temporary 用到了临时表,效果已经非常不好了
- using filesort 文件排序,可能在磁盘,也可能在内存中
以上是关于2021-06-07 mysql索引 + 排序的主要内容,如果未能解决你的问题,请参考以下文章
MySQL——索引视图事务,存储引擎MyLSAM和InnoDB(实战篇!)
深入理解MySQL索引原理和实现——为什么索引可以加速查询?
使用 Perl 中对列表进行排序的索引对另一个列表进行排序和索引
MySQL:有索引和小文件排序还是没有索引和没有文件排序更好?
mysql使用索引扫描来做排序
mysql两表关联排序索引问题