1. MySQL索引基础概念
索引是数据库中用于加速数据检索的数据结构,类似于书籍的目录。在MySQL中,索引主要基于B+树结构实现,能够显著提高查询效率。当表中数据量较大时,没有索引的查询往往需要全表扫描,性能极差。
索引的核心价值体现在:
- 减少磁盘I/O操作
- 加速数据检索
- 保证数据唯一性
- 优化排序和分组操作
注意:索引并非越多越好,不当的索引设计反而会降低数据库性能。每个索引都需要占用存储空间,并且在数据修改时需要维护索引结构。
2. MySQL索引类型详解
2.1 按数据结构分类
B+树索引
MySQL默认的索引类型,适用于全键值、键值范围和键前缀查找。InnoDB和MyISAM引擎都使用B+树作为索引结构。
B+树特点:
- 非叶子节点只存储键值信息
- 所有叶子节点形成有序链表
- 查询性能稳定,时间复杂度O(log n)
哈希索引
基于哈希表实现,适用于等值查询,但不支持范围查询和排序。Memory引擎支持哈希索引,InnoDB有自适应哈希索引功能。
全文索引
用于全文搜索,支持MATCH AGAINST操作。MyISAM和InnoDB(5.6+)都支持全文索引。
2.2 按功能分类
主键索引(Primary Key)
每张表只能有一个主键索引,不允许NULL值。InnoDB中主键索引就是聚簇索引。
唯一索引(Unique Key)
保证列值的唯一性,允许NULL值。一张表可以有多个唯一索引。
普通索引(Index)
最基本的索引类型,没有唯一性限制。
联合索引(Composite Index)
多个列组合建立的索引,遵循最左前缀原则。
3. 索引创建与使用
3.1 创建索引语法
sql复制-- 创建普通索引
CREATE INDEX idx_name ON table_name(column_name);
-- 创建唯一索引
CREATE UNIQUE INDEX idx_name ON table_name(column_name);
-- 创建联合索引
CREATE INDEX idx_name ON table_name(col1, col2, col3);
-- 修改表结构添加索引
ALTER TABLE table_name ADD INDEX idx_name(column_name);
3.2 索引选择原则
- 高选择性列优先:区分度高的列更适合建索引
- 常用查询条件:WHERE子句中频繁使用的列
- 排序和分组列:ORDER BY和GROUP BY涉及的列
- 外键列:经常用于表连接的列
- 避免过度索引:每个索引都会增加维护成本
