前言:本來小表驅動大表的知識應該在前面就講解的,但是由於之前並沒有學習資料批量插入,因此將其放在這裡。在查詢的優化中永遠小表驅動大表。
類似迴圈巢狀
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判斷後面的結果集中有沒有行,有行則...