文章目录

  • 生猛干货
  • Demo Table
  • in的逻辑
    • 优化原则
  • exists的逻辑
  • 搞定MySQL


生猛干货

带你搞定MySQL实战,轻松对应海量业务处理及高并发需求,从容应对大场面试


Demo Table

CREATE TABLE `t1` (`id` int(11) NOT NULL AUTO_INCREMENT,`a` int(11) DEFAULT NULL,`b` int(11) DEFAULT NULL,PRIMARY KEY (`id`),KEY `idx_a` (`a`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;create table t2 like t1;

两个表 t1 和 t2 , 一样的,包括索引信息

数据量 t1 ,t2 如下

mysql> select count(1) from t1;
+----------+
| count(1) |
+----------+
|    10000 |
+----------+
1 row in setmysql> select count(1) from t2;
+----------+
| count(1) |
+----------+
|      100 |
+----------+
1 row in setmysql>

in的逻辑

select * from t1 where id in (select id from t2) ;

这个SQL,先执行哪个呢?

看看执行计划

可以理解为

for(select id from t2){select * from t1 where t1.id = t2.id}

优化原则

原则:小表驱动大表,即小的数据集驱动大的数据集

当T2表的数据集小于T1表的数据集时,in优于exists


exists的逻辑

select * from A where exists (select 1 from B where B.id = A.id)

可以理解为

  for(select * from A){select * from B where B.id = A.id}

当A表的数据集小于B表的数据集时,exists优于in

将主查询A的数据,放到子查询B中做条件验证,根据验证结果(true或false)来决定主查询的数据是否保留

  1. EXISTS (subquery)只返回TRUE或FALSE,因此子查询中的SELECT * 也可以用SELECT 1替换,官方说法是实际执行时会忽略SELECT清单,因此没有区别
  2. EXISTS子查询的实际执行过程可能经过了优化而不是我们理解上的逐条对比
  3. EXISTS子查询往往也可以用JOIN来代替,何种最优需要具体问题具体分析
mysql> explain select * from t2 where exists (select 1 from t1 where t1.id = t2.id) ;
+----+--------------------+-------+------------+--------+---------------+---------+---------+---------------+------+----------+-------------+
| id | select_type        | table | partitions | type   | possible_keys | key     | key_len | ref           | rows | filtered | Extra       |
+----+--------------------+-------+------------+--------+---------------+---------+---------+---------------+------+----------+-------------+
|  1 | PRIMARY            | t2    | NULL       | ALL    | NULL          | NULL    | NULL    | NULL          |  100 |      100 | Using where |
|  2 | DEPENDENT SUBQUERY | t1    | NULL       | eq_ref | PRIMARY       | PRIMARY | 4       | artisan.t2.id |    1 |      100 | Using index |
+----+--------------------+-------+------------+--------+---------------+---------+---------+---------------+------+----------+-------------+
2 rows in set

搞定MySQL

MySQL- In 和 Exists的优化案例讲解相关推荐

  1. MySQL的单表索引优化案例

    创建数据表及插入数据 create table if not exists article(id int(10) unsigned not null primary key auto_incremen ...

  2. Mysql改写子查询SQL优化案例

    sql逻辑需求:需要定期统计表单数据,然后把汇总的结果展示在前端界面 根据业务逻辑实现了sql编写,产生了慢SQL SELECT DISTINCT DATE_FORMAT(sr.SIGN_DATE, ...

  3. Mysql之索引优化案例

    Mysql之索引优化案例 1.单表简单案例 1.1创建表 1.2 问题: 1.3 解决:新建索引 1.4 再次执行 2.双表简单案例 2.1创建表并插入数据 2.2 由于是LEFT JOIN,所以左表 ...

  4. 【运筹优化】元启发式算法详解:模拟退火算法(Simulated Annealing,SA)+ 案例讲解代码实战

    文章目录 一.介绍 二.基础知识 2.1 局部搜索(或蒙特卡罗)算法 2.2 Metropolis 算法 2.3 模拟退火算法 三.原理 3.1 Statistical Equilibrium 统计平 ...

  5. MySQL第12天:MySQL索引优化分析之性能优化案例实践

    MySQL索引优化分析之性能优化案例实践 执行计划中各select_type含义可以看:MySQL第11天:MySQL索引优化分析之性能分析 https://weibo01.blog.csdn.net ...

  6. 【MySQL】故障分析 | MySQL 优化案例 - 字符集转换

    1.概述 好文章转载:故障分析 | MySQL 优化案例 - 字符集转换 一.背景 开发联系我,说是开发库上有一张视图查询速度很慢,9000 条数据要查 10s,要求我这边协助排查优化. 二.问题 S ...

  7. mysql半连接_MySQL优化案例:半连接(semi join)优化方式导致的查询性能低下(转载)...

    以下是来自DBA+社群MySQL领域原创专家李海翔分享的MySQL优化案例,关于MySQL V5.6.x/5.7.x SQL查询性能问题. 一.简单创建一表,并使用存储过程插入一部分数据 二.执行如下 ...

  8. mysql多次join后count优化_mysql join count 优化案例

    记录一个优化sql的实际案例 三张表, 表结构, 索引如下: tb_phoneback_apply有user_id, handle_userid 索引 以及一个 status 和 create_tim ...

  9. MySQL——in和exists优化

    文章目录 前言 in的使用和优化 exists的使用和优化 前言 前面几篇博客重点讲述了索引树的结构,以及索引分主键索引(聚簇索引).普通索引和聚合索引等. 以及也讲述了排序.分页等优化措施. 本篇博 ...

最新文章

  1. 网络对抗技术-实验报告一
  2. apache解析php的方法
  3. 《PHP精粹:编写高效PHP代码》——第1章面向对象编程
  4. 如何从零开始学好单片机
  5. C/C++ 指针数组、二维数组
  6. Recommendation
  7. Windows 8 Directx 开发学习笔记(三)摄像机设置及控制正方体旋转
  8. verilog语法实例学习(3)
  9. 美图秀秀5 android,美图秀秀Android版v1.4.5上线 优化拼图排版秀北爱
  10. 谷歌浏览器启动页被篡改为hao.7654.com的解决办法
  11. 用python计算工程量_总算懂了工程造价工程量计算方法
  12. 人工智能(AI)真的会带来大规模失业吗?
  13. android 补间动画停止,Android动画原理分析(一)---补间动画
  14. 【​观察】解读微软物联网新价值观 三位一体释放“云+端”能量
  15. linux 中dirname的用法
  16. 微型计算机的ALU部件包括在( )之中,微机原理第二章复习题(附答案)期末考试题...
  17. IDEA上传项目到GitHub
  18. 如何在cmd命令行下切换目录
  19. 最全shell脚本语句语法使用(超详细)
  20. 如何使用Arduino开发板读取KY-037声音检测传感器

热门文章

  1. C++多继承(多重继承)详解(一)
  2. 下载服务器 linux系统,如何搭建Linux服务器
  3. 希尔排序的基本原理及实现
  4. Python爬虫应用实战-爬取股票数据做分析
  5. Python爬虫应用实战-网站数据爬取及数据分析
  6. tableau实战系列(三十八)-Tableau Server 端口耗竭的具体表象及如何避免端口耗竭
  7. 建议三连,数据分析师的年终述职报告,留给你的年终报告吧
  8. 10分钟带你入门MATLAB
  9. 【LeetCode从零单排】No19.RemoveNthNodeFromEndofList
  10. 【机器学习算法-python实现】PCA 主成分分析、降维