MySQL索引是提升查询性能的重要手段,合理创建和使用索引能够避免全表扫描。下面通过具体例子说明在真实表中如何建立索引并观察查询变化。

准备示例数据表
先创建一个用户表,包含用户编号、姓名、年龄和所在城市字段,后续基于该表做索引演示。
CREATE TABLE user_info ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL, age INT NOT NULL, city VARCHAR(30) NOT NULL );
创建普通索引
如果经常根据姓名查询用户,可以为 name 字段添加普通索引。
CREATE INDEX idx_name ON user_info(name);
添加索引后,使用 EXPLAIN 查看查询计划,可以看到 type 从 ALL 变为 ref,说明走了索引。
EXPLAIN SELECT * FROM user_info WHERE name = '张三';
创建联合索引
当查询常同时限定城市和年龄时,建立联合索引比单字段索引更高效。
CREATE INDEX idx_city_age ON user_info(city, age);
注意最左前缀原则:查询条件包含 city 或同时包含 city 与 age 时索引生效;仅用 age 则不会使用该联合索引。
-- 生效 SELECT * FROM user_info WHERE city = '北京'; -- 生效 SELECT * FROM user_info WHERE city = '北京' AND age = 30; -- 不生效 SELECT * FROM user_info WHERE age = 30;
常见导致索引失效的写法
在字段上使用函数、类型隐式转换、或以通配符开头的 LIKE 查询,都会让索引失效。
- 对索引列使用函数:WHERE YEAR(created_at) = 2023
- 模糊查询以 % 开头:WHERE name LIKE '%三'
- 字符串字段用数字比较:WHERE name = 100
使用实例总结
通过上面的 user_info 表实例,我们完成了普通索引与联合索引的创建,并利用 EXPLAIN 验证了索引效果。实际开发中,应针对业务高频查询来设计索引,同时避免写出使索引失效的 SQL。定期分析慢查询日志,结合执行计划调整索引结构,才能让 MySQL 保持良好性能。