mysql中or和in的效率

抽象苔藓
• 阅读 8770

前言

今天遇到了一个网站卡死的问题,过了几分钟就好了,找到了一个定时脚本中有个sql,执行效率很慢,DBA建议将or改为in,效率提升了几百倍

场景描述

1.两个表关联查询
2.table1 的数据量接近100万
3.table2 的数据量接近900万
4.查询条件中的title字段没有加索引
5.原始查询语句

SELECT a.id as id FROM `table1`as a left join table2 as b on a.id=b.id WHERE b.title="衣服" or b.title="裤子" or b.title="帽子" limit 0,100

6.改造后的查询语句

SELECT a.id as id FROM `table1`as a left join table2 as b on a.id=b.id WHERE b.title IN ("衣服","裤子","帽子") limit 0,100

改造后的效率

原sql的执行时间为5s,更改之后只需要0.01s

原因

查了一下资料,在数据量过百万,并且条件没有加索引,or的查询效率远远低于in,or的效率为O(n),而in的效率为O(logn), 当n越大的时候效率相差越明显。

参考文章:
https://blog.csdn.net/nimeiji...

点赞
收藏
评论区
推荐文章
Easter79 Easter79
4年前
sql循环语句在update中的应用
sql循环语句在update中的应用在实际的开发场景中,我们有时候要对表中的所有数据进行批量修改,但是当数据量十分盘庞大时,比如几百万几千万条数据,这时候我们执行update语句的话就会长时间锁住该表。这样非常容易造成死锁现象(在企业中DBA肯定是不允许执行这种sql语句的)。所以为了避免出现这种问题,我们在执行批量
Wesley13 Wesley13
4年前
SQL中哪些情况会引起全表扫描
1、模糊查询效率很低:原因:like本身效率就比较低,应该尽量避免查询条件使用like;对于like’%…%’(全模糊)这样的条件,是无法使用索引的,全表扫描自然会效率很低;另外由于匹配算法的关系,模糊查询的字段长度越大,查询的效率就越低。解决办法:首先尽量避免模糊查询,如果因为业务需要一定要使用模糊查询,则至
深入理解MySQL索引底层数据结构
在日常工作中,我们会遇见一些慢SQL,在分析这些慢SQL时,我们通常会看下SQL的执行计划,验证SQL执行过程中有没有走索引。通常我们会调整一些查询条件,增加必要的索引,SQL执行效率就会提升几个数量级。我们有没有思考过,为什么加了索引就会能提高SQL的查询效率,为什么有时候加了索引SQL执行反而会没有变化,本文就从MySQL索引的底层数据结构和算法来进行详细分析。
Kevin501 Kevin501
4年前
Mysql 多表联合查询效率分析及优化
Mysql多表联合查询效率分析及优化一、总结一句话总结:连表操作时:先根据查询条件和查询字段确定驱动表,确定驱动表之后就可以开始连表操作了,然后再在缓存结果中根据查询条件找符合条件的数据1、找出所有在左表,不在右表的纪录?我们可以用右表没有on匹配则显示null的规律,来找出所
Stella981 Stella981
4年前
Spring Boot + Elasticsearch实现大批量数据集下中文的精确匹配
缘由数据存储在MYSQ库中,数据基本维持不变,但数据量又较大(几千万)放在MYSQL中查询效率上较慢,寻求一种简单有效的方式提高查询效率,MYSQL并不擅长大规模数据量下的数据查询。技术方案考虑后期同样会使用到es,此次直接结合springboot框架形成一个独立服务,并不涉及UI展现内容,(ES版本2.4.5,5.0版本的话
Wesley13 Wesley13
4年前
ThinkPHP 根据关联数据查询 hasWhere 的使用实例
很多时候,模型关联后需要根据关联的模型做查询。场景:广告表(ad),广告类型表(ad\_type),现在需要筛选出广告类型表中id字段为1且广告表中status为1的列表先看关联的设置部分 publicfunctionadType(){return$thisbelongsTo('A
Wesley13 Wesley13
4年前
Hibernate常见知识汇总
1.在数据库中条件查询速度很慢的时候,如何优化?1.建索引2.减少表之间的关联3.优化sql,尽量让sql很快定位数据,不要让sql做全表查询,应该走索引,把数据量大的表排在前面4.简化查询字段,没用的字段不要,已经对返回结果的控制,尽量返回少量数据2.在Hibernate中进行多表查询,每个表中各取几个字段,也就是说查询出来的结果
Stella981 Stella981
4年前
Hive性能优化(全面)
1.介绍首先,我们来看看Hadoop的计算框架特性,在此特性下会衍生哪些问题?数据量大不是问题,数据倾斜是个问题。jobs数比较多的作业运行效率相对比较低,比如即使有几百行的表,如果多次关联多次汇总,产生十几个jobs,耗时很长。原因是mapreduce作业初始化的时间是比较长的。sum,
谈了千百遍的数据一致性 | 京东云技术团队
今天来说一个老生常谈的问题,来看一个实际案例:现有业务中往往都会通过缓存来提高查询效率,降低数据库的压力,尤其是在分布式高并发场景下,大量的请求直接访问Mysql很容易造成性能问题。有一天老板找到了你......老板:听说你会缓存?你:来看我操作。你设计了
线上SQL超时场景分析-MySQL超时之间隙锁 | 京东物流技术团队
前言之前遇到过一个由MySQL间隙锁引发线上sql执行超时的场景,记录一下。背景说明分布式事务消息表:业务上使用消息表的方式,依赖本地事务,实现了一套分布式事务方案消息表名:mqmessages数据量:3000多万索引:createtime和statuss
sql优化谓词下推在join场景中的应用
谓词下推的原理是将sql中的限制条件的逻辑尽可能的提前在sql中执行,从而减少加载的数据量,提升下游数据处理的效率以及减少内存消耗。该种方式在hive,MySQL,Doris的语法中均适用。