news 2026/8/12 19:14:19

mysql数据库,明明有索引为啥不用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
mysql数据库,明明有索引为啥不用

为什么全表扫比走索引更划算

走索引不是免费的,是要付 3 笔账:

1.回表 IO:B+Tree 定位到主键后,要再去聚簇索引取整行数据

2.随机 IO:B+Tree 叶子节点物理位置是分散的,每次回表是 4KB 随机读

3.二级索引读:先读二级索引拿到主键列表,再批量回表

而全表扫是顺序 IO,可以预读(innodb_read_ahead),一次读 16KB、32KB 甚至 1MB 进缓冲池。

临界点估算

  • 假设走索引要回表 N 次 → N 次 4KB 随机读 = N × 4KB
  • 全表扫要读 T 字节(表大小)→ T / 1MB 顺序读
  • 顺序 IO 速度是随机 IO 的50-100 倍(SSD 上)
  • 所以当 N > T / 200KB 时,全表扫就赢了

订单表 1 亿行,热门商品占 80% = 8000 万行 → N = 8000 万 → 8000 万 × 4KB = 320GB 随机读,这账算不过来。

MySQL 优化器怎么算这笔账

MySQL 8.0+ 是CBO(Cost-Based Optimizer),核心是这 3 个数据:

1.table_rows:来自information_schema.tables或 InnoDB 采样估算

2.cardinality(索引基数):唯一值数量,区分度越高越值得用索引

3.clustering_factor:索引顺序和物理顺序的相关度(Oracle 有,MySQL 弱化)

优化器对比两个方案的cost = io_cost + cpu_cost,谁便宜选谁。

关键陷阱

  • table_rowscardinality都是估算值,不准(尤其大表 + 未 ANALYZE TABLE)
  • innodb_stats_persistent_sample_pages 默认 20 页,统计可能严重失真
  • 业务上"热点"是动态的(爆款商品),但统计是离线的(每天/每周更新)——所以"昨天走索引,今天走全表"是真实存在的

怎么判断当前 SQL 走没走索引

EXPLAIN看 4 个字段:

EXPLAIN SELECT * FROM orders WHERE product_id = 12345;

字段关注值含义
typeALL= 全表扫 /ref/range= 用索引type=ALL 就是问题
rows优化器估算要扫的行数rows=10000 但实际是 80000000 = 估算炸了
ExtraUsing where后还有Using filesort走索引但要回表排序
filtered100 = 全用上 / 10 = 过滤掉 90%估算保留比例

重点:光看 type=ALL 不一定有问题,要结合rows和表实际大小。

实战 4 步修法(按代价从低到高)

Step 1:先 ANALYZE TABLE(最便宜,0 改动)

ANALYZE TABLE orders; -- 重新采样统计
  • 适合:统计失真
  • 不适合:业务真的"热点数据"(统计反而是准的)

Step 2:让选择性更高(改 SQL / 加索引)

-- ❌ 热点商品 product_id=12345SELECT * FROM orders WHERE product_id = 12345;-- ✅ 加 status 联合条件SELECT * FROM orders WHERE product_id = 12345 AND status = 'PAID';-- 索引变成 (product_id, status),选择性 = 8000w/1亿 × 70% = 56%-- 走索引更划算

Step 3:覆盖索引(不查主表)

-- 原 SQLSELECT product_id, user_id FROM orders WHERE product_id = 12345;-- 索引 (product_id, user_id) → 覆盖索引,不回表-- 不用全表扫,也不用回表

Step 4:业务层硬拆(最后手段)

  • 冷热分离:热数据进 Redis / ES / ClickHouse
  • 分库分表:按 user_id 拆,单表行数下来,全表扫也很便宜
  • 强制索引:FORCE INDEX(idx_product_id)——慎用,会让后续优化器失明

"索引不是'有就一定用'。MySQL 优化器是 CBO,它会算两笔账:走索引要回表 N 次,每次 4KB 随机 IO;全表扫要读 T 字节顺序 IO。当热点数据占表 80% 以上时,走索引要回表几千万次,随机 IO 开销反而比全表扫大。判断方法是 EXPLAIN 看 type 是不是 ALL,再看 rows 估算准不准。修法优先级:ANALYZE TABLE → 改 SQL 提选择性 → 覆盖索引 → 业务冷热分离。强制索引 FORCE INDEX 是最后手段,因为硬指定索引会让 CBO 失去对其他场景的适应能力。"

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/12 19:11:57

深圳网站建设哪家强?深度解析易通鼎如何以真诚服务与企业共赢未来

本文关键词:深圳网站建设 易通鼎在深圳这座充满活力的城市里,每天早晨的闹钟响起,无数个创业者、企业主和团队开始了一天的忙碌。高楼大厦的玻璃幕墙反射着初升的太阳,地铁口涌动着匆忙的身影,写字楼里的键盘敲击声此起彼伏。这是一个梦想与现实激烈碰撞的地方,也是一个机…

作者头像 李华
网站建设 2026/8/12 19:10:13

AI技能调用新范式:索引+按需读取机制详解与工程实践

1. 项目概述:从“索引”到“技能”的智能调用革命 最近在折腾AI应用开发,特别是围绕像Claude、GPT这类大语言模型构建智能体(Agent)时,一个核心痛点越来越明显:如何让AI精准、高效地调用我们为它准备的“技…

作者头像 李华
网站建设 2026/8/12 19:09:19

基于WASM与IPC桥接的零侵入Electron应用可观测性SDK设计

1. 从一次线上故障说起:为什么Electron应用的可观测性是个“老大难”问题? 去年,我们团队负责的一个大型桌面应用(基于Electron)在版本更新后,遭遇了一次诡异的线上故障。用户反馈应用在特定操作下会“卡死…

作者头像 李华
网站建设 2026/8/12 19:07:06

做乌克兰网站建设时千万别只照搬国内套路深度解析本地化运营那些坑与机遇

说实话,最近聊到“乌克兰网站建设”这个事儿,我发现很多国内的企业或者外贸朋友,心里其实都打鼓。大家可能习惯了国内那种极致的速度、五彩斑斓的运营手段,还有动不动就搞个大促的氛围,但当你把目光转向乌克兰市场时,你会发现,这里的水深得很,而且逻辑完全不一样。今天…

作者头像 李华
网站建设 2026/8/12 19:07:17

架构图配色实战指南:从混乱到专业的视觉沟通心法

1. 从“五彩斑斓的黑”到“清晰传达”:架构图配色的核心价值每次评审技术方案,最怕看到什么样的架构图?不是画得简陋,而是配色混乱。一张好的架构图,就像一份精心设计的PPT,颜色是它的“语言”。它不仅仅是…

作者头像 李华
网站建设 2026/8/12 19:05:41

现代Web表格开发:从基础架构到性能优化的实战指南

1. 项目概述:从“表格”到“数据界面”的认知跃迁“Web课程table相关学习笔记”——这个标题看起来平平无奇,甚至有些学生气。但作为一名和前端打了十几年交道的开发者,我深知这个看似基础的“表格”,恰恰是Web开发中一个深不见底…

作者头像 李华