最左匹配原则
MySQL建立联合索引时会遵守最左前缀匹配原则,即最左优先,在检索数据时从联合索引的最左边开始匹配。 可以看到 a 的值是有顺序的,1,1,2,2,3,3,而b的值是没有顺序的1,2,1,4,1,2。但是我们又可发现 a 在等值的情况下,b 值又是按顺序排列的,但是这种顺序是相对的。这是因为MySQL创建联合索引的规则是首先会对联合索引的最左边第一个字段排序,在第一个字段的排序基础上,然后在对第二个字段进行排序。所以b=2这种查询条件没有办法利用索引。
explain 语句的关键点以及ES分析语句性能的关键字
MySQL explain 应用详解(吐血整理🤩) 关键点:
- rows:扫描行
- type:访问的类型
- key:实际使用到的索引,如果为 null ,则没有使用索引
Type
(从左往右,越靠左边的越优秀) NULL > system > const > eq_ref > ref > ref_or_null > index_merge > range > index > ALL
分别解读一下:
- system:表只有一行记录
const 表示通过索引一次就找到了,const 用于比较 primary key 或 uique 索引,因为只匹配一行数据,所以很快,如主键置于 where 列表中,MySQL 就能将该查询转换为一个常量。index :index只遍历索引树,通常比All快。因为,索引文件通常比数据文件小,也就是虽然all和index都是读全表,但index是从索引中读取的,而all是从硬盘读的。- ALL:如果一个查询的type是All,并且表的数据量很大,那么请解决它!!!
Key 字段
实际使用的索引,如果为 null,则没有使用索引,否则会显示你使用了哪些索引,查询中若使用了覆盖索引(查询的列刚好是索引),则该索引仅出现在key列表。
Extra字段
- Using filesort 表示当SQL中有一个地方需要对一些数据进行排序的时候,优化器找不到能够使用的索引,只能硬排
- Using tempporary 表示在对MySQL查询结果进行排序时,使用了临时表,这样的查询效率是比外部排序更低的,常见于 order by 和 group by。
- Using index 表示使用了索引,很优秀👍。
为什么使用 B+ 树
树可以有二叉,也可以有多叉。多叉树就是每个节点有多个儿子,儿子之间的大小保证从左到右递增。二叉树是搜索效率最高的,但是实际上大多数的数据库存储却并不使用二叉树。其原因是,索引不止存在内存中,还要写到磁盘上。
你可以想象一下一棵100万节点的平衡二叉树,树高20。一次查询可能需要访问20个数据块。在机械硬盘时代,从磁盘随机读一个数据块需要10 ms左右的寻址时间。也就是说,对于一个100万行的表,如果使用二叉树来存储,单独访问一个行可能需要20个10 ms的时间,这个查询可真够慢的。
为了让一个查询尽量少地读磁盘,就必须让查询过程访问尽量少的数据块。那么,我们就不应该使用二叉树,而是要使用“N叉”树。这里,“N叉”树中的“N”取决于数据块的大小。
[ 数据库索引 ] B树和B+树
|