前言
在数据库性能优化中,索引优化无疑是最关键的一环。合理的索引设计能够将查询性能提升几个数量级,而不当的索引则可能导致数据库性能急剧下降。本文将深入探讨MySQL索引优化的各个方面,包括索引类型选择、复合索引设计、避免索引失效的实践、索引维护策略以及监控方法。
一、选择正确的索引类型
MySQL支持多种索引类型,每种类型都有其适用场景:
1. B-tree索引(默认索引类型)
特点:
- 平衡树结构,适合范围查询和排序
- 支持=、>、>=、<、<=、BETWEEN、IN等操作符
- 支持LIKE 'prefix%'的前缀匹配
适用场景:
- 大多数常规查询
- 需要排序或分组的字段
- 高基数(高唯一性)的列
-- 创建B-tree索引
CREATE INDEX idx_name ON users(last_name);
2. Hash索引
特点:
- 基于哈希表实现,查询时间复杂度O(1)
- 仅支持精确匹配(=、IN),不支持范围查询
- Memory引擎默认索引类型,InnoDB支持自适应哈希索引
适用场景:
- 等值查询且不涉及排序
- 内存表(MEMORY引擎)
-- 创建Hash索引(仅Memory引擎)
CREATE INDEX idx_email ON users(email) USING HASH;
3. Full-text全文索引
特点:
- 专门用于文本搜索
- 支持自然语言搜索和布尔搜索
- InnoDB和MyISAM都支持
适用场景:
- 文本内容的搜索
- 替代低效的LIKE '%keyword%'查询
-- 创建全文索引
ALTER TABLE articles ADD FULLTEXT INDEX ft_idx_content(content);
-- 使用全文搜索
SELECT * FROM articles WHERE MATCH(content) AGAINST('数据库');
4. R-tree空间索引
特点:
- 用于地理空间数据
- 支持GIS几何数据类型
适用场景:
- 地理位置查询
- 地图应用
-- 创建空间索引
CREATE SPATIAL INDEX sp_idx_location ON parks(location);
二、复合索引设计与最左前缀原则
复合索引(多列索引)的设计对查询性能影响极大,必须遵循最左前缀原则。
最左前缀原则
MySQL使用复合索引时,会从最左边的列开始匹配。如果查询条件中不包含索引的最左列,索引将无法被使用。
示例:
-- 创建复合索引
ALTER TABLE orders ADD INDEX idx_composite(order_date, customer_id, status);
-- 能使用索引的查询
SELECT * FROM orders WHERE order_date = '2023-01-01';
SELECT *