MySQL里各种索引到底是啥,怎么用才算合适,有点乱想跟你聊聊
- 问答
- 2026-01-08 07:24:46
- 7
索引就是个“书前面的目录”
你得理解索引最核心的比喻:它就像一本书最前面的目录,你想找书里讲“索引优化”的内容,如果没有目录,你就得一页一页地翻,这叫“全表扫描”,效率极低,但有了目录,你直接找到“索引优化”对应的页码,翻过去就行了,速度飞快,数据库里的索引干的就是这个事儿,它帮你快速定位到你想找的数据在哪里,避免扫描整个表。
MySQL里常见的几种索引
MySQL里索引类型不少,但咱们日常打交道最多的,主要是这几种:
-
普通索引(INDEX):这是最基础的索引,没有任何限制,就像一本普通的书目录,只告诉你内容在哪一页,它唯一的作用就是加快查询速度,你可以在单个列上建,也可以在多个列上建(组合索引,这个后面细说)。
-
唯一索引(UNIQUE):它和普通索引类似,但多了一个约束:索引列的值必须是唯一的,不能重复,比如你给用户的身份证号字段建一个唯一索引,数据库就保证不会存进去两个一样的身份证号,这既能加速根据身份证号的查询,又能保证数据不重复,一举两得。
-
主键索引(PRIMARY KEY):这是最强的索引,它一定是唯一索引,值不能重复,它还有个更重要的特点:被设为主键的列不能为NULL(空值),一张表只能有一个主键,它通常是表的“身份证”,比如用户表的用户ID,数据库通常会默认围绕主键来组织数据的物理存储顺序(对于InnoDB引擎来说就是这样)。
-
组合索引(也叫复合索引):这个特别重要,也容易用错,它不是一种新的索引类型,而是一种创建索引的方式,指的是在多个列上共同建立一个索引,你有一个用户表,你经常需要根据“城市”和“年龄”这两个条件来查人,你就可以创建一个(城市,年龄)的组合索引。
怎么用才算合适?这才是关键
知道了有哪些索引,怎么用对地方才是真本事,用错了索引,可能不但没提速,反而拖慢了写数据的速度(因为每次插入新数据都要更新索引)。
高选择性的列建索引 “选择性”听起来专业,其实很简单,就是一个字段的值重复度越低,它的选择性就越高,就越适合建索引,身份证号”字段,几乎每个值都唯一,选择性极高,建索引效果拔群,相反,“性别”字段只有“男”、“女”等几个值,选择性极低,你给它建个索引,数据库查的时候发现符合条件的还是一大堆,可能最后还是得扫描大量数据,索引就白建了。
考虑查询的“左前缀原则”(针对组合索引) 这是组合索引的精髓,假设你建了一个 (A, B, C) 的组合索引,它相当于同时拥有了三个索引的功能:(A), (A, B), 和 (A, B, C)。
- 能用的查询:
WHERE A = xxx、WHERE A = xxx AND B = yyy、WHERE A = xxx AND B = yyy AND C = zzz,这些查询都能高效地利用这个组合索引。 - 不能用的查询:
WHERE B = yyy、WHERE C = zzz、WHERE B = yyy AND C = zzz,这些查询就用不上这个索引!因为索引是按照A、B、C的顺序组织的,你跳过A直接找B或C,就像你翻字典跳过字母A直接找以B开头的单词一样,索引就失效了。
建立组合索引时,一定要把最常用作查询条件的列放在最左边。
为ORDER BY和JOIN优化 索引不仅用于WHERE条件,还能用于排序(ORDER BY)和连接(JOIN),如果你的查询经常需要按某个字段排序,给这个字段建索引可以避免耗时的临时文件排序,同样,在经常进行JOIN操作的列(比如外键)上建索引,可以极大提升连接速度。
一些常见的误区和建议
- 索引不是越多越好:每多一个索引,就像给书多编一份目录,书内容改了,所有目录都得更新,数据库也一样,每次增、删、改数据,都需要更新相关的索引,索引太多会严重拖慢写操作的速度。
- 小表可以不用索引:如果一张表就几百条记录,数据库直接全表扫描可能比走索引还快,因为省去了查找索引的开销。
- 前缀索引:如果有一个很长的文本字段(比如文章内容),你不可能为整个内容建索引,但如果你经常根据内容的前几个字来查,可以只对字段的前N个字符建立索引,这就是前缀索引,能节省很多空间。
总结一下
聊了这么多,其实核心就几点:
- 索引是目录,用来加速查询。
- 主键和唯一索引除了加速,还管着数据唯一性。
- 组合索引威力大,但必须遵守“左前缀原则”,把最常用的条件放左边。
- 用在刀刃上:给选择性高的、经常用于查询、排序、连接的列建索引。
- 别贪多:索引不是免费的,维护它有成本。
最开始乱没关系,多实践几次,比如用EXPLAIN命令看看你的SQL语句到底用了哪个索引,慢慢就能找到感觉了,希望这么聊下来,你能觉得清晰一点。

本文由酒紫萱于2026-01-08发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://www.haoid.cn/wenda/76680.html
