MySQL 索引优化入门:让查询飞起来

MySQL 索引优化入门:让查询飞起来

大家好呀!今天想和大家聊聊 MySQL 索引优化的那些事儿。索引就像数据库里的 “目录”,用好索引能让查询速度飙升,反之则可能让数据库慢如蜗牛。这篇文章就来聊聊最基础的索引优化思路,新手也能轻松 get~

一、先搞懂常见的索引类型

索引不是万能的,不同场景要选不同的索引。按字段个数来分,常用的有这几种:

1. 单值索引(单个字段的索引)

最常用的索引类型,给表中的某一个字段创建索引。比如给用户表的username字段建索引:

CREATE INDEX idx_username ON user(username);

适合:经常用where username = 'xxx'这样的查询场景。

2. 唯一索引(unique)

和单值索引类似,但要求字段的值不能重复(比如手机号、身份证号):

CREATE UNIQUE INDEX idx_phone ON user(phone);

适合:既要加速查询,又要保证数据唯一性的场景(比如用户手机号登录)。

3. 联合索引(多个字段的索引)

给多个字段一起创建索引,比如给user表的agename字段建联合索引:

CREATE INDEX idx_age_name ON user(age, name);

这是优化的重点,后面详细说~

4. 主键索引

最特殊的唯一索引,每张表只能有一个主键索引,InnoDB 引擎会默认按主键顺序存储数据,查询效率最高。

二、联合索引的 “最左前缀原则” 是核心

联合索引是优化多条件查询的利器,但用好的关键是记住 “最左前缀原则”。比如创建了(a, b, c)的联合索引,那么:

  • 能用到索引的情况:where a=?where a=? and b=?where a=? and b=? and c=?

  • 用不到索引的情况:where b=?(缺少 a)、where b=? and c=?(缺少 a)

举个例子,比如查询 “年龄 25 岁且名字叫张三的用户”,如果创建(age, name)的联合索引,这个查询就能快速命中;但如果索引是(name, age),那效率就会差很多。

小技巧:创建联合索引时,把查询频率高、区分度大的字段放前面(比如 “性别” 这种区分度低的字段就不适合放前面)。

三、这些情况会让索引 “失效”,一定要避开!

索引建好了但没用上?大概率是踩了这些坑:

  1. 索引字段用了函数:比如where SUBSTR(name, 1, 1) = '张',索引会失效

  2. 用了 “不等于”(!=、<>):比如where age != 25,可能导致全表扫描

  3. like 以 % 开头where name like '%三'会失效,where name like '张%'则可以用到索引

  4. 类型转换:比如字段是 varchar 类型,查询时用where phone = 13800138000(数字),会触发类型转换导致索引失效

  5. 联合索引不满足最左前缀:前面说过的,缺少最左字段会失效

四、索引优化的小原则

  1. 不滥用索引:索引会让插入 / 更新变慢(因为要维护索引结构),小表甚至不需要索引

  2. 优先用联合索引代替多个单值索引:比如where a=? and b=?,建(a,b)联合索引比单独建 a 和 b 的索引更高效

  3. 定期分析慢查询:通过explain命令查看 SQL 执行计划,判断索引是否被用上(关注type列,出现refrange说明用到了索引,ALL则是全表扫描)

总结

索引优化的核心就是:让查询尽可能命中索引,避开会导致索引失效的操作。刚开始不用追求复杂的优化技巧,先把最左前缀原则和索引失效场景记牢,就能解决 80% 的性能问题啦~ 下次查询变慢时,不妨先检查一下索引是不是用对了哦!

你可能感兴趣的:(MySQL,mysql,数据库)