小表驅動大表

2022-07-05 07:42:11 字數 1559 閱讀 5294

類似迴圈巢狀。

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

}

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

在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

1from 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

1from 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 大表 驅動 MySQL小表驅動大表

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

MySQL 小表驅動大表

小表驅動大表 準備兩站表 create table student id int 11 notnull,no varchar 20 default null name varchar 20 default null primary key id engine innodb default chars...

為什麼小表驅動大表?

a.假如只有乙個索引的話 小表一趟for迴圈的代價 大表上使用b 樹索引的代價 大表一趟for迴圈的代價 小表使用b 樹索引的代價 b.假如使用塊的巢狀迴圈連線的話 記憶體中放小表的i o代價小於記憶體中放大表的 i o代價,資料庫系統實現p108,簡而言之,經過化簡是 b s b s b r m ...