内容并不详细,但均为高频考察点,每个不熟悉的地方都应该自行寻找拓展资料。
考点:
- 索引的原理、类型、结构
- 创建索引的注意事项,使用原则
- 如何排查和消除慢查询
1 索引的原理、类型、结构
什么是索引:
- 索引是数据表中一个或多个列进行排序的数据结构
- 索引可以大幅提升检索速度
- 创建、更新索引本身也会消耗空间和时间
查找发展史:
- 顺序查找
- 折半查找(插入慢)
- Hash(占空间,不适用于大数据,底层是冗余数组)
- BST(不适用于大数据,复杂度易退化)
- AVL树(是二叉树,结点多时,仍非常高)
- 多路查找树
- 多路平衡查找树——B树与B+树
B树:
- m阶多路平衡查找树
- 叶节点有相同深度
- 节点数据的关键字递增
- 无法有效实现范围查找
B+树(B树的变形):
- MySQL实际使用的作为索引的数据结构
- 只在叶子结点带有指向记录的指针,目的是将存储空间让给叶子结点,增加树的度
- 叶子结点通过指针(双向)相连,实现范围查找
多路平衡查找树的阶并不是越大越好:
- 阶越大,树的高度越低,这是好事
- 但硬盘分块、内存分页,阶应该是根据硬盘块的大小确定的,这与OS管理硬件的方式有关
- 为了让OS更好的加载、缓存数据,一般将4KB作为结点大小
MySQL索引类型:
- 普通索引(CREATE INDEX)
- 唯一索引(CREATE UNIQUE INDEX)
- 多列索引
- 主键索引(PRIMARY KEY),一个表只能有一个
- 全文索引(FULLTEXT INDEX),InnoDB不支持,是搜索引擎的搜索原理,通过倒排索引实现
创建索引的注意事项,使用原则
何时创建索引:
- 经常作查询条件的字段(WHERE)
- 经常用作表连接的字段
- 经常出现在order by,group by之后的字段
注意事项:
- 索引字段应非空,即NOT NULL,MySQL难以对空值作查询优化,因为空值在B+树中无法比较,所以很多都有默认值
- 索引字段应区分度高、离散度大,不应该有大量相同值,例如一个枚举值,就没必要
- 索引字段长度不应太长,否则比较较为耗时,例如主键索引为INT,快,而字符串比较就很慢
如何排查和消除慢查询
索引失效(慢查询)的情况:
扫描二维码关注公众号,回复:
8765366 查看本文章
- 模糊匹配,以%开头的LIKE语句,这是因为B+树无法对此进行直接比较
- 类型隐转,这是因为B+树无法对两个类型不同的量进行直接比较
- 不满足最左前缀原则
总的来说,都是B+树的key无法进行有效的比较
如何排查慢索引:
- 通常是由于缺少索引、索引不合理或业务代码导致
- 可通过slow_query_log_file开启并查询慢查询日志
- 可以通过explain排查索引问题
- 防止数据类型不匹配导致的全表扫描
- 防止一次获取太多访问