日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL- In 和 Exists的优化案例讲解

發布時間:2025/3/21 数据库 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL- In 和 Exists的优化案例讲解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 生猛干貨
  • 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)來決定主查詢的數據是否保留

  • EXISTS (subquery)只返回TRUE或FALSE,因此子查詢中的SELECT * 也可以用SELECT 1替換,官方說法是實際執行時會忽略SELECT清單,因此沒有區別
  • EXISTS子查詢的實際執行過程可能經過了優化而不是我們理解上的逐條對比
  • 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的优化案例讲解的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。