在MySQL中建索引时需要注意哪些事项?
在 MySQL 中建立索引是优化查询性能的重要手段,但不当的索引设计可能导致资源浪费、性能下降甚至拖慢写入速度。
所以我们我们首先要判断对于一个字段或者一些字段要不要建立索引。
适合建立索引的字段通常是:
-
主键字段:MySQL 会自动为主键创建索引
-
频繁作为查询条件的字段:WHERE(减少全表扫描的开销,从而提高查询性能)、JOIN(加快表之间的连接速度)、ORDER BY(直接利用索引的有序性进行排序,提高排序性能)、GROUP BY(帮助数据库快速将数据分组) 中频繁出现的列
-
选择性高的字段:对于选择性高的字段,索引可以更有效地过滤数据,减少需要扫描的记录数。
选择性是指列中不同值的数量与总行数的比例。选择性高的字段意味着不同值的数量较多,重复值较少。
所以相对的,不适合建立索引的字段通常是:
-
字段的值有大量重复的,比如性别字段
-
长字段,为这种字段建立索引会占用大量空间,如长字符串(如
VARCHAR(255)
) -
组成联合索引的其中一个索引不适合再创建,如已存在联合索引
(A, B)
,单独为A
建索引就是冗余的。要避免冗余索引
然后,如果我们要创建索引的话,就要选择合适的索引类型:
-
主键索引(Primary Key):必须唯一且非空,InnoDB 会以主键构建聚簇索引(数据按主键顺序存储)。
-
唯一索引(Unique Index):确保列值唯一,适用于唯一性约束(如邮箱、身份证号)。实现一人一单。
-
普通索引(Non-unique Index):加速查询,但允许重复值。
-
联合索引(Composite Index):多个列组合的索引,如果多个条件经常一起查询,可以考虑联合索引,减少索引数量。联合索引需注意最左前缀原则(查询条件必须包含联合索引的最左列)。
-
全文索引(Full-text Index):适用于文本字段的模糊搜索(如
LIKE '%keyword%'
),但性能有限,可以结合 Elasticsearch 等专用工具。 -
空间索引(Spatial Index):用于地理空间数据(如
GEOMETRY
类型)。
但是,索引也有一定的代价:
-
写入性能下降:每次 INSERT/UPDATE/DELETE 需要维护索引,索引越多,写操作越慢。所以我们要控制索引的数量。虽然索引加速查询,但写操作会变慢,需要权衡读写比例。比如在写频繁的表上,索引不宜过多。
-
占用磁盘和内存:索引需要存储空间,尤其是长字段的索引。