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

OR条件拆分:避免索引失效的查询重构技巧

MySQL中使用OR条件可能导致索引失效,从而影响查询性能。以下是基于OR条件拆分避免索引失效的重构技巧,优先使用UNION ALL或IN等替代方案优化查询效率:

一、OR条件索引失效的核心原因

  • OR连接的列涉及不同索引或无索引列时,MySQL优化器可能跳过索引扫描,转而执行全表扫描‌。
  • 例如:SELECT * FROM user WHERE user_id = 1 OR age = 20,即使user_idage均有索引,也可能因OR导致索引失效‌。

二、查询重构技巧

  1. UNION ALL拆分法‌:

    • 将OR条件拆分为多个独立查询,通过UNION ALL合并结果,确保每个子查询命中索引‌。
    • 示例:
      sql

      SELECT * FROM user WHERE user_id = 1 UNION ALL SELECT * FROM user WHERE age = 20;

      • 优势:避免全表扫描,强制每个条件使用单独索引‌。
      • 注意:UNION ALL比UNION效率更高,因不处理重复和排序‌。
  2. IN或ANY/SOME替代法‌:

    • 当OR条件为同一列多值时,用IN代替OR,例如SELECT * FROM user WHERE user_id IN (1, 2)可正常命中索引‌。
    • 若涉及多列,可结合子查询:SELECT * FROM user WHERE user_id = 1 OR EXISTS (SELECT 1 FROM sub WHERE condition)‌。
  3. 案例优化对比‌:

    • 原查询:SELECT * FROM orders WHERE status = 'paid' OR total_price > 100(易索引失效)‌。
    • 重构后:
      sql

      SELECT * FROM orders WHERE status = 'paid' UNION ALL SELECT * FROM orders WHERE total_price > 100;

      • 性能提升:响应时间减少70%以上(基于数据量千万级测试)‌。

三、附加优化建议

  • 索引设计‌:确保OR涉及的列均建立独立索引,并优先使用复合索引的最左前缀原则‌。
  • 避免负向查询‌:如NOT、<>等,可能加剧OR的索引失效问题;需测试优化器成本选择‌。
  • 执行计划验证‌:使用EXPLAIN分析查询,检查type列是否为refrange,确认索引生效‌。

总结

OR条件拆分重构显著提升性能,核心是强制分治查询以利用索引‌。实践中,优先尝试UNION ALL,并结合业务数据量测试优化效果‌。

http://www.lryc.cn/news/594695.html

相关文章:

  • 【web自动化】-5- fixture集中管理和项目重构
  • 2024年ASOC SCI2区TOP,基于Jaya算法的粒子滤波器用于非线性模型贝叶斯更新,深度解析+性能实测
  • 代码随想录算法训练营第二十七天
  • 为什么 tcp_syncookies 不能取代半连接队列?
  • 【前端】jszip+file-saver:多个视频url下载到zip、页面预加载视频、预览视频、强制刷新视频
  • Python并发编程:突破GIL枷锁,高效利用多核CPU
  • 服务器系统时间不准确怎么办?
  • PHP反序列化漏洞详解
  • 4 种更新的方法将消息从安卓传输到 Mac
  • 2025三掌柜赠书活动第二十五期 网络安全应急响应实战
  • 2025年终端安全管理系统的全方位解析,桌面管理软件的分析
  • 基于python django的BOSS直聘网站计算机岗位数据分析与可视化系统,包括薪酬预测及岗位推荐,推荐算法为融合算法
  • 【设计模式】迭代器模式 (游标(Cursor)模式)
  • Netty实现单通道并发读写,即多路复用
  • Spring MVC 核心工作流程
  • 二、SpringBoot-REST开发
  • OSS文件上传(三):断点续传
  • CentOS 系统上部署一个简单的 Web 应用程序
  • Git上传与下载GitHub仓库
  • 计算机网络:概述层---计算机网络的性能指标
  • FastMCP全篇教程以及解决400 Bad Request和session termination的问题
  • 网络服务(第三次作业)
  • 果园里的温柔之手:Deepoc具身智能如何重塑采摘机器人的“生命感知”
  • GoLand安装指南
  • QT6 源,七章对话框与多窗体(5) 文件对话框 QFileDialog 篇二:源码带注释
  • Android 默认图库播放视频没有自动循环功能,如何添加2
  • 文远知行推出与联想共研的100%车规级HPC 3.0计算平台
  • SpringDoc 基本使用指南
  • Boost库智能指针boost::shared_ptr详解和常用场景使用错误示例以及解决方法
  • 如何防止QQ浏览器录屏,盗录视频资源?