MySQL高階知識(十六) 小表驅動大表

2022-02-04 12:40:51 字數 1564 閱讀 3790

前言:本來小表驅動大表的知識應該在前面就講解的,但是由於之前並沒有學習資料批量插入,因此將其放在這裡。在查詢的優化中永遠小表驅動大表。

類似迴圈巢狀

for(int i=5;.......)

}

如果小的迴圈在外層,對於資料庫連線來說就只連線5次,進行5000次操作,如果1000在外,則需要進行1000次資料庫連線,從而浪費資源,增加消耗。這就是為什麼要小表驅動大表。

根據mysql高階知識(十)——批量插入資料指令碼中的相應步驟在tb_dept_bigdata表中插入100條資料,在tb_emp_bigdata表中插入5000條資料。

注:100個部門,5000個員工。tb_dept_bigdata(小表),tb_emp_bigdata(大表)。

①當b表的資料集小於a表資料集時,用in優於exists。

select *from tb_emp_bigdata a where a.deptno in (select b.deptno from tb_dept_bigdata b)
b表為tb_dept_bigdata:100條資料,a表tb_emp_bigdata:5000條資料。

用in的查詢時間為:

將上面sql轉換成exists:

select *from tb_emp_bigdata a where exists(select 1 from tb_dept_bigdata b where b.deptno=a.deptno);
經對比可看到,在b表資料集小於a表的時候,用in要優於exists,當前的資料集並不大,所以查詢時間相差並不多。

②當a表的資料集小於b表的資料集時,用exists優於in。

select *from tb_dept_bigdata a where a.deptno in(select b.deptno from tb_emp_bigdata b);
用in的查詢時間為:

將上面sql轉換成exists:

select *from tb_dept_bigdata a where exists(select 1 from tb_emp_bigdata b where b.deptno=a.deptno);
由於資料量並不是很大,因此對比並不是難麼的強烈。

下面結論都是針對in或exists的。

in後面跟的是小表,exists後面跟的是大表。

簡記:in小,exists大。

對於exists

select .....from table where exists(subquery);

可以理解為:將主查詢的資料放入子查詢中做條件驗證,根據驗證結果(true或false)來決定主查詢的資料是否得以保留。

MySQL高階知識 小表驅動大表

當b表的資料集必須小於a表的資料集時,用in優於exists select from a where id in select id from b 當a表的資料集小於b表的資料集時,用exists優於in select from a where exists select 1 from b wher...

mysql 高階 mysql高階知識

一.儲存引擎 引擎 指的是乙個系統的核心部分 引擎有不同分類是為了適應不同的使用場景 檢視mysql支援所有引擎 show engines mrg myisam 是一堆myisam表的集合 用於做水平分表,如果乙個表中資料量太大 將導致效率降低 水平分表就是把整個大表拆成不同的小表,每一次查詢 會判...

mysql 大表 驅動 MySQL小表驅動大表

在了解之前要先了解對應語法 in 與 exist。in後的括號的表示式結果要求先輸出一列字段。與之前的搜尋字段匹配,匹配到相同則返回對應行。mysql的執行順序是先執行子查詢,然後執行主查詢,用子查詢的結果按條匹配主查詢。exist後的括號裡則無輸出要求,exist判斷後面的結果集中有沒有行,有行則...