时间:2020-05-21来源:电脑系统城作者:电脑系统城
1. 前置知识
InnoDB 索引使用的数据结构是 B+ 树。
百度百科中的结构图:
一个 m 阶 B+
树的几个特点:
[m/2]
个子女,根结点至少有两个子女可以类比字典,通过笔画找到一个字怎么办?总不能一页一页去翻吧?当然不能。
字典的修订者会加上字笔画目录,只要查清楚字的笔画数,然后去对应的笔画目录下去找就可以了。
咦~ 怎么这个笔画下面还有这么多字?总不能一页一页去翻吧?当然不会。
找到对应的笔画数之后,目录下还有部首的目录,部首的目录是按照部首笔画数排序的,查清部首的笔画数,然后去挨个找部首就行了。
找到部首之后,就会定位到具体的字了。
当然 B+ 树和字典目录还是有很多不一样的地方,只是为了比较好理解
每次搞不懂 B+
树的时候,可以想想小时候怎么查字典的。
简单来说,我们能使用索引进行高效查询是基于索引的以下特性
这个很好理解,因为函数会改变索引本身的值,不再具有有序性
联合索引中,非最左前缀是无序的
a, b, c
三列索引,先按照 a
排序,后按照 b
排序,再按照 c
排序
语句 a=1 and b > 1 and c=2
只能使用 a, b
索引进行筛选,c=1
条件需要将前面筛选之后的索引结果逐一比较之后返回结果。
a
索引过滤之后是有序的,所以可以使用 b
索引进行过滤,b
过滤之后是无序的(也有可能是有序的,但是 innodb
不会再去判断是否有序)
强类型下,数据类型不一致,需要特殊处理才能比较
这个只是有可能,因为 innodb
底层是基于成本选择使用索引的。
因为在无索引的列上使用 or
会使成本变大,所以很容易无法使用索引。
强类型下,数据类型不一致,需要特殊处理才能比较
但是如果 in
里面都是字符串或者都是数字,innodb
的优化器会将其统一转成索引所需类型。
200
个值【可】在 in
语句中 5.7
版本上 超过 200
个值,就会放弃使用 index_dive
方式计算cost
,从而导致估算不准确,很容易用不上索引
5.6
以下版本 req_index_dive_limit
为 10
,可以酌情修改成 200
2023-10-30
windows上的mysql服务突然消失提示10061 Unkonwn error问题及解决方案2023-10-30
MySQL非常重要的日志bin log详解2023-10-30
详解MySQL事务日志redo log一、单表查询 1、排序 2、聚合函数 3、分组 4、limit 二、SQL约束 1、主键约束 2、非空约束 3、唯一约束 4、外键约束 5、默认值 三、多表查询 1、内连接 1)隐式内连接: 2)显式内连接: 2、外连接 1)左外连接 2)右外连接 四...
2023-10-30
Mysql删除表重复数据 表里存在唯一主键 没有主键时删除重复数据 Mysql删除表中重复数据并保留一条 准备一张表 用的是mysql8 大家自行更改 创建表并添加四条相同的数据...
2023-10-30