SELECT * 拖慢索引效率是因为被迫回表查聚簇索引,而非索引变慢;LIKE '%abc' 无法利用B+树有序性导致全索引扫描;ORDER BY/GROUP BY 需匹配索引最左前缀且方向一致;隐式转换、函数、运算等使索引失效但执行计划仍可能显示 type: ref。
为什么
SELECT *
会拖慢索引效率
不是索引本身变慢,而是 MySQL 在满足查询时被迫放弃覆盖索引(Covering Index),转而回表查聚簇索引。只要
SELECT
的字段没全在索引里,哪怕只多一个
id
,也可能触发回表。
复合索引
(a, b, c)
可以高效响应
SELECT a, b FROM t WHERE a = 1 AND b > 10
(覆盖索引)
但
SELECT a, b, d FROM t WHERE a = 1
就必须回表取
d
,即使
d
是主键——因为
d
不在索引列中
SELECT *
几乎必然导致回表,尤其当表有大字段(
TEXT
、
BLOB
)时,I/O 成倍增加
LIKE '%abc'
为什么用不上索引
前导通配符破坏了 B+ 树的有序查找路径。索引本质是按字典序存储的有序结构,
LIKE 'abc%'
可以定位到
abc
开头的范围,但
'%abc'
需要扫描全部叶子节点匹配后缀,等价于全索引扫描。
LIKE 'abc%'
→ 走索引(range)
LIKE '%abc'
→ 不走索引(除非全文索引或倒排索引扩展)
LIKE '%abc%'
→ 同样不走索引;MySQL 8.0+ 对某些
utf8mb4
排序规则支持函数索引:
CREATE INDEX idx_name ON t ((LOWER(name)))
,但不能直接解决后缀模糊
ORDER BY
和
GROUP BY
怎么避免 Using filesort
关键看排序字段是否构成索引的最左前缀,且方向一致。MySQL 只能利用索引的天然顺序,无法“跳着”用。
MySQL(Linux)
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
下载
索引