专栏名称: 脚本之家
脚本之家(jb51.net)是国内专业的网站建设资源、脚本编程学习类网站,以后将为大家分享更多有用的信息,希望大家多多支持宣传。
目录
相关文章推荐
为你读诗  ·  若无闲事挂心头,便是人间好时节 ·  昨天  
为你读诗  ·  关于人生与爱情,他早已写透 ·  昨天  
当代  ·  李约热:小村医事|新刊预览+创作谈 ·  2 天前  
51好读  ›  专栏  ›  脚本之家

明明是同一条SQL,为什么有时候走索引a,有时候却走索引b ?

脚本之家  · 公众号  ·  · 2025-05-27 17:00

正文

请到「今天看啥」查看全文


MySQL优化器的决策流程如下:

成本计算示例

索引名称
预估扫描行数
回表次数
排序成本
总成本
idx_status
50万
50万次
需要排序
1050分
idx_create_time
5万
5万次
无需排序
600分

根据扫描行数、回表次数、排序成本,计算一个总成本的分数。

优化器会选择总成本更低的idx_create_time索引。

3 导致索引切换的四大真凶

真凶1:数据分布变化

场景还原

  • 周一数据:已支付订单5万条,其中2025年的5万条
  • 周二数据:已支付订单50万条,其中2025年的50万条

这个例子中数据分布变化很大,周二的数据,比周一的数据一下子多了45万。

可能会影响总成本的分数。

我们可以通过下面的SQL查看数据分布:

SELECT 
  COUNT(*) AS total,
  SUM(status='paid'AS paid_count,
  SUM(create_time>'2023-01-01'AS new_orders 
FROM orders;

真凶2:统计信息过期

统计信息过期,就像用去年的地图导航,新修的路不会出现在地图上。

MySQL的"地图"就是统计信息。

我们可以通过ANALYZE TABLE ... DELETE STATISTICS命令删除统计信息:

ANALYZE TABLE orders DELETE STATISTICS;

这时候查询可能变成全表扫描:







请到「今天看啥」查看全文