日常入坑

一直以为sql优化中in的效率一定比exists低,所以在一次接口中将原来的in改成了exists,自认为效率一定会比之前高,结果被狠狠打脸。

b表的数据导入导致这个接口的查询极慢,需要5秒左右,这是不可想象的,赶忙拉sql分析,最终定位在exists上,尝试换成in,效率高了不是一点!!

于是决定去网上再看看有关的资料。

分析

in和exists区别

in:是把外表(a)和内表(b)做hash连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。

这两者的效率与a,b两表的数据大小相关,当两个表的大小相当时in和exists的差别不大。

如果两个表中的一个表较小,一个表较大,那么子查询表大的用exists,子查询较小的用in,效率会高。*

这下就明白了,我的查询语句中a表的数据量是10万多,b表的数据是8千多,因此子查询表小应该用in

举个栗子:

表A(小表),表B(大表)1:

select * from A where cc in (select cc from B)

效率低,用到了A 表上cc 列的索引;

select * from A where exists(select cc from B where cc=A.cc)

效率高,用到了B 表上cc 列的索引。

若表A(大表),表(小表),第一种效率高(in),第二种效率低(exists)。

not in 和not exists *

如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;

而not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用not exists 都比not in 要快。

or与in效率

or的效率为O(n),而in的效率为O(logn), 当n越大的时候效率相差越明显。

——————《mysql数据库开发的36条军规》

如果in和or所在列有索引或者主键的话,or和in没啥差别,执行计划和执行时间都几乎一样。如果in和or所在列没有索引的话,性能差别就很大了。在没有索引的情况下,随着in或者or后面的数据量越多,in的效率不会有太大的下降,但是or会随着记录越多的话性能下降非常厉害,从第三中测试情况中可以很明显地看出了,基本上是指数级增长。

因此在给in和or的效率下定义的时候,应该再加上一个条件,就是所在的列是否有索引或者是否是主键。如果有索引或者主键性能没啥差别,如果没有索引,性能差别不是一点点!

mysql or的效率_Mysql比较exists与in以及or的效率分析相关推荐

  1. mysql exists 效率_Mysql之exists和inner join效率问题(1)

    使用两张大小差距比较大的表来进行测试 前言:在使用laravel的过程中发现whereHas实现的方式是exists子查询,又听说exists尽量少使用,容易导致慢查询,于是就有了接下来两篇文章. 两 ...

  2. MySQL时间字段效率_MYSQL数据库时间字段INT,TIMESTAMP,DATETIME性能效率比较

    正 文: 在数据库设计的时候,我们经常会需要设计时间字段,在MYSQL中,时间字段可以使用int.timestamp.datetime三种类型来存储,那么这三种类型哪一种用来存储时间性能比较高,效率好 ...

  3. mysql删除表崩溃_MySQL在删除表时I/O错误原因分析

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 问题现象 最近使用sysbench测试MySQL,由于测试时间较长,写了一个脚本按prepare->run->cleanup的顺 ...

  4. mysql dml回滚_mysql binlog回滚/闪回,前滚, 分析各表DML情况, 找出长事务与大事务...

    简介 binlog_inspector通过解释mysql/mariadb binlog/relaylog实现以下三大功能: 1)flashback/闪回/回滚, 实现DML的回滚到任意时间或者位置. ...

  5. mysql if exists用法_MySQL中EXISTS的用法

    比如在Northwind数据库中有一个查询为 SELECT c.CustomerId,CompanyName FROM Customers cWHERE EXISTS(SELECT OrderID F ...

  6. mysql多索引结构_MySQL 索引结构

    谈到 MYSQL 索引服务端的同学应该是熟悉的不能再熟悉,新建表的时候怎么着都知道先来个主键索引,对于经常查询的列也会加个索引加快查询速度.那么 MYSQL 索引都有哪些类型呢?索引结构是什么样的呢? ...

  7. mysql字段简索引_Mysql索引优化攻略(全)

    所谓索引就是为特定的mysql字段进行一些特定的算法排序,比如二叉树的算法和哈希算法,哈希算法是通过建立特征值,然后根据特征值来快速查找.而用的最多,并且是mysql默认的就是二叉树算法 BTREE, ...

  8. mysql数据结构面试题_MySQL面试题汇总

    事务是什么? 一系列操作,要么全部完成,要么一个都不做 事务的ACID特性 原子性:一系列操作要么都执行,要么都不执行 一致性:事务执行前后数据完整性不变,如转账前后总金额不变 隔离性:多个事务并发访 ...

  9. mysql 存储过程 定义数组_MySql存储过程

    Mysql进阶 存储过程 1 什么是存储过程 1.存储过程,带有逻辑的sql语句 2.之前的sql没有条件判断,没有循环 3.存储过程带上流程控制语句(if while) 2 存储过程特点 1)执行效 ...

最新文章

  1. 【刷算法】LeetCode.278-第一个错误的版本
  2. Java 错误: 找不到或无法加载主类,问题集合
  3. CSS3--transition
  4. Exception.InnerException 属性的使用
  5. SpringBoot项目的 pom.xml第一行报错
  6. html table tr 动态加减行操作
  7. 一文搞懂HTML+CSS+JavaScript
  8. 「解决方案」用户变电站配电监控解决方案
  9. SOUI自定义控件(4)
  10. 通达OA2019版本全功能
  11. 如何解决Mac电脑中的“AppStore无法下载软件”问题?
  12. 1:STM32CubeMX配置STM32F103C8T6驱动-下载软件配置RCC,CAN1,USART1
  13. 从程序关闭Windows。
  14. unity简单小球下落
  15. 设计按钮、下拉框、文本框的测试用例要点
  16. 计算机应用基础原文,计算机应用基础(本) - 平时作业
  17. 无法连接到internet 小黄叹号长时间不消失的问题
  18. 【已解决】adb connect x.x.x.x:5555报错由于 目标计算机积极拒绝,无法连接
  19. android 扫描二维码黑屏,android--zxing返回扫描界面出现黑屏的解决方案
  20. data augment

热门文章

  1. NCBI中SRA数据库简介
  2. 引用(Reference)
  3. 人,与动物的本质区别,在哲学里说是制造和使用工具
  4. navicat的使用
  5. 【多标签文本分类】Improved Neural Network-based Multi-label Classification with Better Initialization ……
  6. Input.GetTouch 获取触摸
  7. 从洗牌算法谈起--Python的random.shuffle函数实现原理
  8. ASP.NET Core Web Razor Pages系列教程八: 添加验证
  9. ubuntu安装KVM
  10. php in_array 遍历,in_array大数组查询性能问题