MySQL- In 和 Exists的优化案例讲解
生活随笔
收集整理的這篇文章主要介紹了
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)來決定主查詢的數據是否保留
搞定MySQL
總結
以上是生活随笔為你收集整理的MySQL- In 和 Exists的优化案例讲解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL - Join关联查询优化 -
- 下一篇: MySQL - 体系结构初探