摘要:
本文简单介绍了MySQL索引的核心知识,包括两种主要索引结构:B+树索引(支持排序和范围查询)和哈希索引(高效查找)。重点分析了索引使用法则,特别是联合索引的最左前缀原则及其失效场景(如范围查询、列运算、模糊查询等)。同时提出了9大优化策略,包括避免索引列运算、使用覆盖索引减少回表查询等。通过explain语句进行SQL性能分析,并介绍了SQL提示等高级优化技巧,帮助开发者合理使用索引提升查询效率。
一,简单介绍
索引(index)是一种能够使mysql快速获取数据的数据结构(有序)。
二,索引结构
1,B+tree
优化B+树的存储节点为双向链表,方便排序和范围查询
[内部节点]
/ | \
▼ ▼ ▼
[叶子节点] ↔ [叶子节点] ↔ [叶子节点]
(含实际数据) (链表连接) (有序排列)
- 内部节点仅存储键值和子节点指针
- 叶子节点存储实际数据或数据指针,并通过链表连接相邻叶子节点
2,Hash
索引 0: ∅
索引 1: ∅
索引 2: ➔ ["apple",10]
索引 3: ➔ ["cherry",30] ➔ ["date",40]
索引 4: ∅
索引 5: ➔ ["banana",20]
优点:
(1)高效查找与操作
(2)灵活的键类型支持
(3)动态空间管理
三,对比与思考
补充:存放数据的叶子节点维护了一个双向循环链表,便于排序和范围查询
四,sql性能分析(explain语句)
五,索引使用
最左前缀法则(联合索引)
查询从索引的最左列开始,最左边的索引字段必须存在,并且不跳过中间在索引中的列,如果跳过了索引中间的某一列,索引会部分失效。
1,范围查询(联合索引)
出现范围查询(>,<),范围右侧的列索引失效,如果范围使用(>=,<=)可以避免右侧索引失效
2,索引列运算
不要在索引列上进行运算操作,索引将会失效,如截取函数substring()...等
3,字符串不加引号
字符串类型字段使用时,不加引号,索引将失效
4,模糊查询
尾部模糊不会影响,如果是头部模糊,索引失效
5,or条件查询
如果查询条件出现or,or的只有一侧条件有索引,索引失效
6,数据分布影响
如果MYSQL评估使用索引比全表更慢,则不使用索引
7,SQL提示
在SQL语句中人为地加入一些提示来优化操作(use/ignore/force index())指定索引
8,覆盖索引
本质就是避免索引查询出现回表查询,导致索引多搜寻一次,增加性能消耗,尽量不要使用select * ....进行查询
9,总结