在数据库日常使用中,频繁的SELECT查询是拖慢系统性能的常见原因,为SELECT语句中常用的筛选列创建合适的索引,是提升查询效率的重要手段。索引相当于数据的目录,能让数据库引擎快速定位到符合条件的记录,减少全表扫描带来的资源消耗。

索引对SELECT查询的作用原理
当执行带有筛选条件的SELECT语句时,如果筛选列没有索引,数据库引擎需要逐行扫描整张表的所有记录,判断是否符合条件,这个过程就是全表扫描,随着表数据量增大,耗时会增加很多。如果筛选列存在索引,引擎会先查询索引结构,快速定位到符合条件的记录位置,再直接读取对应数据,大幅减少扫描的数据量。
适合为SELECT筛选列创建索引的场景
并不是所有SELECT筛选列都适合创建索引,以下场景创建索引的收益会比较明显:
- 经常出现在WHERE子句中的筛选列,尤其是数据区分度高的列,比如用户表的用户ID、订单表的订单编号等
- 经常作为JOIN连接条件的列,多表关联查询时,连接列的索引能提升关联效率
- 经常出现在ORDER BY、GROUP BY子句中的列,索引本身是有序的,能减少排序和分组的临时计算开销
创建索引的具体操作示例
以MySQL数据库为例,创建索引的语法如下,假设我们有一张用户表user_info,经常执行根据手机号查询用户的SELECT语句:
-- 查看当前表的索引情况 SHOW INDEX FROM user_info; -- 为手机号列创建普通索引 CREATE INDEX idx_phone ON user_info(phone); -- 如果表数据量很大,也可以创建索引时指定索引长度,减少索引存储空间 CREATE INDEX idx_phone_prefix ON user_info(phone(11));
创建完成后,再次执行对应的SELECT查询,数据库引擎会优先使用idx_phone索引来定位数据:
-- 使用手机号查询用户,此时会命中idx_phone索引 SELECT id, username, phone FROM user_info WHERE phone = '13800138000';
创建索引的注意事项
虽然索引能提升查询效率,但也不能盲目创建,需要注意以下问题:
- 索引会占用额外的存储空间,每张表的索引数量不宜过多,一般建议不超过5个
- 索引会降低INSERT、UPDATE、DELETE操作的效率,因为每次数据变更都需要同步更新索引结构
- 数据区分度低的列不适合创建索引,比如性别列只有男、女两个值,创建索引后查询效率提升非常有限
- 如果SELECT查询的筛选条件使用了函数或者表达式,比如
WHERE YEAR(create_time) = 2023,普通索引会失效,这种场景可以考虑创建函数索引
索引效果的验证方法
创建索引后,可以使用EXPLAIN关键字查看SELECT语句的执行计划,判断索引是否被命中:
-- 查看查询的执行计划 EXPLAIN SELECT id, username, phone FROM user_info WHERE phone = '13800138000';
执行结果中,key字段会显示实际使用的索引名称,如果显示的是创建的索引名,说明索引生效;如果显示NULL,说明没有使用索引,需要检查索引创建是否正确或者筛选条件是否符合索引使用规则。