当前位置: 首页 > news >正文

【MySQL-索引调优】07:Sql使用索引注意点

PS:现在orders表中存在idx_user_id(user_id),以及idx_user_status(user_id, status)两个索引

1-是否走索引

并不是符合条件的sql就一定要走索引,数据库内部有优化器,优化器会选择成本最低的执行计划

运行:

EXPLAINSELECT*FROMordersWHEREuser_id>1ANDstatus=1;

结果为:

idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra
1SIMPLEordersALLidx_user_id,idx_user_status995205Using where

优化器选择了全表扫描,没有使用(user_id)(user_id, status)索引

数据是随机生成的,user_id是0 ~ 10000,递增的,条件user_id > 1几乎匹配:99% 数据,走索引会大量回表,此时不如走全表扫描,所以优化器选择全表扫描

2-索引失效

如果针对sql的字段有计算操作,那么索引就会失效

运行:

EXPLAINSELECT*FROMordersWHEREuser_id+1=5;

结果为:

idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra
1SIMPLEordersALL99520100Using where

分析:

根本没有用到索引,因为user_id + 1,需要进行运算,这意味着数据库必须:

读取每一行 计算 user_id +1再判断是否等于5#-------------------------扫描整表 ↓ 计算 user_id +1↓ 判断=5

不要在索引列上做运算

2-2.常见索引失效的写法

  • 运算:
user_id+1=5price*10>100
  • 函数:
DATE(create_time)='2025-01-01'
  • 类型转换:
#字符串与数字比较可能触发转换user_id='123'

2-3.索引失效优化

原则:保持索引列“原样参与比较”

  • 例如时间查询:
错误:WHEREDATE(create_time)='2025-01-01'正确:WHEREcreate_time>='2025-01-01'ANDcreate_time<'2025-01-02'

2-4.索引的隐式转换

orders表中的user_id是BIGINT类型,这里查询不是用的数字,运行:

EXPLAINSELECT*FROMordersWHEREuser_id='1';

结果为:

idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra
1SIMPLEordersrefidx_user_id,idx_user_statusidx_user_id9const9100Using index condition

分析:

发现还是用到了索引,MySQL进行隐式类型转换,将'1' → 1,执行逻辑等价于:WHERE user_id = 1

本质上确实发生了类型转换,但最佳实践还是保持类型一致

http://www.cnnetsun.cn/news/1352390.html

相关文章:

  • 科罗菲双罐软水机:家用水质革命的最佳选择
  • hive数据库模糊查询表名
  • 原核表达系统全解析:从原理到应用的技术指南
  • 微软、谷歌确认:Anthropic Claude 仍向非国防客户开放
  • NASA航天器软件架构:冗余设计的突破与挑战
  • 互联网大厂Java面试:谢飞机的“精彩”表现
  • 云平台测试实战:AWS Lambda性能深度调优策略
  • 金融交易系统高可用测试指南:构建永不宕机的安全防线
  • 基于Hadoop+Spark+Hive小红书舆情分析可视化预测系统 大数据技术 社交平台数据分析小红书评论情感分析
  • Harness 工程 vs 上下文工程
  • MySQL主键设计原则与自增ID的潜在问题分析
  • 文章_640111893003
  • AI幽默感测试:让机器讲笑话不冷场的科学方法
  • 搞懂大模型!一文看懂ChatGPT原理,小白程序员建议收藏
  • 分布式模型预测控制(DMPC):从车队到航天器的智能协作
  • 图像处理原理
  • 伪真openclaw主动式智能体—告别‘巨婴’AI工具人:体验主动智能体的魅力
  • 第4节:CUDA实战——并行向量加法(从CPU到GPU的性能飞跃)
  • 揭秘RAG落地神器:OpenRAG快速构建智能知识库(干货满满),从零基础到实战,收藏这一篇就够了!
  • 全网唯一 霍奇猜想六级全域解构证明
  • 详解MySQL的limit关键字用法
  • 拓扑排序(Topological Sort)
  • 提示系统SQL优化从慢到快:架构师用提示工程实现查询响应速度提升10倍
  • Spring Boot 配置文件优先级机制
  • C++中的策略模式实战
  • 记一个BUG:Trae里MongoDB和MySQL MCP不能共存
  • vue根据数字显示对应的文字状态
  • 基于STM32F4的CANopen快速SDO通信(超级详细)
  • 【UART】Verilog实现UART接收和发送模块
  • 实战案例:使用混合推理打造高性能AI原生应用