空间换时间
MySQL每次读取都是16KB的数据
若加了索引
若主键是int(4个字节)(指针占6个字节)
第一层 16KB/(4+6)==1638
第二层 1638*1638=2683044
第三次 2683044*16=42928704
这里的16 是假设每一条数据占1KB
索引只是一种数据结构
全表扫描 :从叶子节点从左往右一直扫描
走索引: 从B+树从上往下一直扫描
InnoDB 里面 的回表:
建立联合索引时,查到最后末子节点,是主键,然后回表在主键索引里面查
范围查找导致索引失效原理分析
走索引 与 全表扫描 做比较 看谁更快
所以,我们在写查找条件时尽量精确
覆盖索引的原理
例如 select b from t where b>1
就会走索引 ,因为b在联合索引(b,c,d)里面
查到了不需要回表就可以直接返回
sql 里你查询的这个字段就在你sql所利用的索引里面
select a,b,c,d from t where b>1
也会走索引
索引扫描的底层原理
select b from t 也会走索引 一种 主键方式遍历,一种联合索引遍历
如果时全表扫描的话,把每条字段b取出来
bcd 索引结构
区别:主键索引树下末子节点存的是 所有数据,而联合索引下末子节点存的是主键值,而每次最多读16KB,所以联合索引树末子节点存的数据更多
所以联合索引只需要 遍历三页,比全表扫描快
select c from t 也会走索引 原理同上 ,不会从上往下走索引,比全表扫描快
order By 为什么会破环索引
select * from t order by b,c,d; 不会走索引
MySQL的数据类型转换
字符转换为数字 转换为0
特例:如果字符是数字 就 直接转换为数字
对字段进行操作导致索引失效原理
- 类型转换
- 字段操作(加减乘除)
原因:这个树可能会被破坏,而且这个树可能在正在被使用