索引加速select查询的根本原因是改变数据访问方式:无索引需全表扫描,有合适索引可直接定位目标行或范围,依赖b+树有序结构和最左前缀匹配规则。
索引为什么能加速 SELECT 查询
根本原因不是“索引快”,而是它改变了数据访问方式:没有索引时,MySQL 必须全表扫描(type: ALL),逐行比对;有合适索引时,可直接定位到目标行或范围,跳过大量无关数据。这依赖 B+ 树的有序结构和最左前缀匹配规则。
注意:索引只在查询条件中实际用到的列上生效。比如建了 (a, b, c) 联合索引,但查询写的是 WHERE b = 1,该索引大概率不会被使用——因为不满足最左前缀。
- 用
EXPLAIN看key和possible_keys是否命中索引 -
type字段是关键:const/ref/range表示走了索引,ALL或index往往意味着慢 - 索引列参与计算(如
WHERE YEAR(create_time) = 2023)或加了函数/表达式,会导致索引失效
哪些字段适合建索引
不是“查得频繁就加索引”,而是看是否具备高选择性、是否出现在 WHERE / JOIN / ORDER BY / GROUP BY 子句中,并且未被函数包裹。