一 基础知识
explain 解析
id | 有多个值的时候 大的先执行 | |
select_type | ||
table | 用到的表 | |
partitions | 分区 | |
type | 连接类型(至少到ref) | system、const、eq_ref、ref。。。 |
possible_keys | 可能选择的索引 | 为空表示没有索引 |
key | 实际选择的索引 | 实际使用索引 |
key_len | 索引长度 | 越小越好(和字段类型和字符编码有关) |
ref | 索引的哪一列被引用了 | |
rows | 被扫描的行 | |
filtered | ||
extrea |
二叉树
平衡二叉树
B-Tree
B+Tree
B-Tree 和B+Tree 对比
- B+Tree 树非叶子节点只存储索引不存储数据,B-Tree 树非叶子节点存储索引和数据。
- B+Tree叶子节点数据有索引。对于范围查询的数据更好
二 索引
创建索引的条件
- 经常作为条件的字段(注意最左原则)
- 分组、排序、去重、唯一性约束
- 连接字段(注意连接字段类型保持一致否则可能隐式转换索引失效)的字段作为索引
不建议创建索引
- 表的记录数据比较少
- 大量重复的数据(索引效率会变低)
- 频繁更新的字段(索引维护开销)
索引失效的场景
- 使用了左模糊
- 使用 OR 的部分字段没有索引
- 字符串条件未使用 ‘ ’ 引起来
- 不符合最左原则
- 隐式转换
- 使用了表达式 或者函数 (eg: where age+1=18 . where substring(name,1,3)='zhang'