MySQL中索引的用处、分类及匹配方式如下:
一、索引的用处
索引的核心作用是加速数据检索,具体表现为:
- 快速定位WHERE条件匹配的行:通过索引的B+树结构快速缩小数据范围,减少全表扫描的IO开销。
- 优化排序与分组:若排序或分组字段包含索引的最左前缀,可直接利用索引顺序避免文件排序(Filesort)。
- 表连接优化:在多表连接时,通过索引快速检索关联字段,减少回表次数。
- 覆盖查询:若查询字段全部包含在索引中,无需回表即可获取数据(覆盖索引)。
- 最小/最大值查询:直接通过索引的叶子节点获取特定列的极值(如MIN(age))。
二、索引的分类
- 主键索引(Primary Key):唯一且非空的字段,通常基于自增ID或业务唯一标识,叶子节点存储完整行数据。
- 唯一索引(Unique Index):字段值唯一但允许NULL,适用于业务唯一性约束(如手机号)。
- 普通索引(Index):无唯一性要求的普通字段索引,用于加速查询。
- 全文索引(Fulltext Index):针对文本类型(如VARCHAR、TEXT)的模糊匹配,但实际应用较少,通常由搜索引擎替代。
- 组合索引(Composite Index):多字段联合创建的索引,遵循最左匹配原则,需注意字段顺序对查询效率的影响。
三、索引匹配方式
- 全值匹配:查询条件完全匹配组合索引的所有字段(如WHERE a=1 AND b=2 AND c=3),此时索引利用率最高。
- 最左前缀匹配:仅匹配组合索引的前N个字段(如WHERE a=1 AND b=2),但WHERE b=2无法利用该索引。
- 列前缀匹配:对字段前缀进行模糊查询(如WHERE name LIKE '张%'),但需避免将模糊条件放在索引首列(如WHERE name LIKE '%张'会失效)。
- 范围值匹配:对字段进行范围查询(如WHERE age > 20),但范围字段后的索引列无法被使用(如WHERE a=1 AND b>2 AND c=3中仅a和b生效)。
- 精确+范围混合匹配:精确匹配左侧字段后,对右侧字段进行范围查询(如WHERE first_name='Mike' AND last_name LIKE 'Hill%')。
- 覆盖索引查询:查询字段全部包含在索引中(如SELECT first_name, last_name FROM user WHERE first_name='Mike'),通过EXPLAIN的Extra字段显示Using index。
四、关键技术名词
- 回表:普通索引查询需先通过索引找到主键,再通过主键索引获取完整数据,增加IO开销。
- 索引下推(ICP):MySQL 5.6+特性,在组合索引中尽可能提前过滤数据,减少回表次数(如WHERE name='张' AND age>20先通过name筛选,再对age过滤)。
- 最左匹配原则:组合索引的字段顺序决定查询匹配方式,需根据高频查询设计字段顺序以平衡空间与效率。
五、索引使用建议
- 小表无需索引,全表扫描更快;中大型表合理设计索引可显著提升性能;超大表需考虑分区、分库分表。
- 避免过度索引:每个索引占用存储空间并增加写入开销,需权衡读写比例。
- 使用EXPLAIN分析查询计划,关注type(访问类型)、key(使用的索引)、extra(额外信息)等字段优化索引设计。