原来的 SQL:能走到索引

SELECT count(1)
FROM XXX
WHERE 1 = 1 AND
(
  (3_id = 12345)
  OR 
  (4_id = 12345)
);
很多人都喜欢用 OR 去解决,虽然语句简单,但是就会发生下面的场景,容易走不到索引

新需求导致改造SQL为: 走不到索引

SELECT count(1)
FROM XXX
WHERE 1 = 1 AND
 (
  (3_id = 12345)
  OR 
  (4_id = 12345)
  OR 
  (2_id = 12345)
 );
 or 跟 and 不一样,添加 (3_id,4_id,2_id) 不能解决问题。

优化的方法是改成 union。分成多个 sql,走各自的索引。如果可能有重复就用union 不用union all。

select count(1) from 
 (
     SELECT * FROM XXX WHERE 1 = 1 AND (3_id = 12345) 
     union 
     SELECT * FROM XXX WHERE 1 = 1 AND (tk_4th_pub_id = 12345) 
     union 
     SELECT * FROM XXX  WHERE 1 = 1   AND (tk_pub_id = 12345)
 ) as a where a.refund_status = XXX;
or 条件在数据库上很难优化,能在代码里优化逻辑,不至于拖垮数据库。只有在 or 条件下无需索引时(且需要比较的数据量小),才考虑。

相同字段 or 可改成 in,如 f_id=1 or f_id=100 -> f_id in (1,100)。上述优化情景都是存储引擎在 InnoDB 情况下,在MyISAM有不同
————————————————
版权声明:本文为CSDN博主「wenniuwuren」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wenniuwuren/article/details/89472136

MySQL 使用 OR 条件导致索引失效相关推荐

  1. mysql left join 索引失效_MySQL索引列上做操作导致索引失效案例分析

    索引列上做操作导致索引失效 通常我们认为只要建立索引就可以万事大吉,以为只要建立就一定会使用到,可其实在索引列上的计算.函数.类型转换都可能导致索引失效,所以我们不仅要会创建索引,更重要的是如何正确的 ...

  2. mysql联合索失效_mysql 联合索引生效的条件、索引失效的条件

    1.联合索引失效的条件 联合索引又叫复合索引.两个或更多个列上的索引被称作复合索引. 对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分.例如索引 ...

  3. MySQL 字符集不一致导致索引失效的一个真实案例

    文章目录 问题描述 问题分析 总结 大家好,我是只谈技术不剪发的 Tony 老师.今天给大家分析一个由于 MySQL 字符集不一致导致索引失效的案例. 问题描述 有个朋友给我发来一个问题,说是他们的系 ...

  4. mysql隐式转换造成索引失效的事故总结

    隐式转换导致索引失效.这一点应当引起重视.也是开发中经常会犯的错误. 由于表的字段tu_mdn定义为varchar2(20),但在查询时把该字段作为number类型以where条件传给mysql,这样 ...

  5. 【数据库】13种会导致索引失效语句写法

    数据库的索引是保证数据快速查询的重中之重,以下13种会导致索引失效语句会导致你的SQL查询索引失效,具体如下: 1.使用like关键字模糊查询时,% 放在前面索引不起作用,只有"%" ...

  6. 索引法则--LIKE以%开头会导致索引失效进而转向全表扫描(使用覆盖索引解决)...

    Mysql 系列文章主页 =============== 1 准备数据 1.1 建表 DROP TABLE IF EXISTS staff; CREATE TABLE IF NOT EXISTS st ...

  7. 索引法则--字符串不加单引号会导致索引失效

    Mysql 系列文章主页 =============== 1 准备数据 1.1 建表 DROP TABLE IF EXISTS staff; CREATE TABLE IF NOT EXISTS st ...

  8. or导致索引失效的解决方法_SQL优化之索引失效

    尽量全值匹配 建表语句: CREATE TABLE `t_logs` ( `id` int(10) NOT NULL AUTO_INCREMENT, `action` varchar(100) DEF ...

  9. MySQL like查询后置%索引失效分析

    MySQL like查询后置%索引失效分析 表结构 CREATE TABLE `t_food_shop` (`id` bigint(20) unsigned NOT NULL AUTO_INCREME ...

最新文章

  1. memcached(二)事件模型源码分析
  2. 连岳读书|这是不让人害怕的数学,课堂上学不到的数学!
  3. OOM分析之问题定位(二)
  4. Nginx配置文档具体解释
  5. LinkedIn公司采用超大规模数据中心设计
  6. [CentOS] CentOS 6 IPv6 关闭方法
  7. sql 基础增删改查语句
  8. m1 MBA配置python及Numpy科学计算环境
  9. 大数据学习笔记:ZooKeeper练习
  10. 是否担心别人将你的博客文章全部爬下来?3行代码教你检测爬虫
  11. Javascript综合应用小案例
  12. android studio创建构造方法,使用Android studio创建你的第一个项目
  13. Node.js 开发者的 Rust 入门指南
  14. 二进制安装的mysql怎么卸载_mysql安装-----二进制包安装及卸载
  15. 从“三只小猪”的故事到“高性能”测试自动化
  16. 《中国人工智能学会通讯》——9.6 哈希学习
  17. CSS3_线性渐变(linear-gradient)+ 盒子阴影(box-shadow)
  18. QT正则表达式---针对IP地址
  19. 《阿里感悟》- 技术人员的职业规划
  20. C语言---双人贪吃蛇

热门文章

  1. QT的QLinkedList类的使用
  2. QT的QAudioInput类的使用
  3. c++原型模式prototype
  4. 「JupyterNotebook-bug」Jupyter Notebook卸载已安装的第三方库不能输入yes的问题
  5. 02_tensorflow2环境安装、CUDA 10.1 和CUDnn 7.6.5 版本安装、https://tensorflow.google.cn/overview中概述翻译
  6. B18_NumPy副本和视图(视图或浅拷贝、副本或深拷贝、深浅拷贝)
  7. MULE ESB环境搭建和例子(通过装插件的方式)
  8. js防止表单重复提交
  9. Python描述性统计示例
  10. ImportError: cannot import name cbook