進行連線查詢時,先保證待連線表的 engine 和default charset 保持一致(可有效提速)
保證 on 條件列的索引(重要!)
列出表的資訊:
show create table `table_name`;
show index from `table_name`;
mysql的關聯演算法是 nest loop join,通過驅動表的結果集作為迴圈基礎,一條條的通過該結果集中的資料作為過濾條件到下乙個表中查詢資料,最後合併。(n表關聯同理)(因此要對關聯查詢做優化就是儘量減少 nest loop 的迴圈次數)
可以通過 explain 來檢視語句的具體情況
explain
select sessions.id from `sessions`
left join `__temp` on sessions.id = __temp.id;
其結果中第一條出現的表就是驅動表.
故使用小資料量的結果集作為驅動表為最優(盡量縮小驅動表的基礎資料量)
mysql的優化器會幫你選擇最優的驅動表(在你不指定驅動表的情況下)
(ps: 可以在mysql的information_schema資料庫中查詢資料庫及表的大小
例:select table_name,
concat(round(sum(data_length/1024/1024),2),'mb') as data_length_mb,
concat(round(sum(data_length/1024/1024),2),'mb') as index_length_mb,
table_rows from tables where table_schema='database' and table_name='table'; )
關於連線的認識
笛卡爾積 會先產生m n條記錄,再根據後面的條件進行篩選 左連線 表a left outer join 表b on 條件 where 他會先根據on 後面的條件進行篩選 他會以表a為主,當表a中有的,b中沒有的會在結果中出現 b的資料用null,但a中沒有,b中有的不會出現 右連線 與左連線相反,他...
關於連線池
對於複雜的web英語,訪問資料庫會比較頻繁,如果每乙個連線都需要連線資料庫然後斷開,對資源的消耗是巨大的。連線復用。通過建立乙個資料庫連線池以及一套連線使用管理策略,使得乙個資料庫連線可以得到高效 安全的復用,避免了資料庫連線頻繁建立 關閉的開銷。對於共享資源,有乙個很著名的設計模式 資源池。該模式...
關於連線 JOIN(二)
通常我們不得不從兩個或更多的表中選取資料使查詢結果更完整。這時便需要使用連線查詢 join 資料庫中的表通過關鍵字相互關聯。主鍵是所有列中擁有唯一值列。每乙個主鍵值必須是表中唯一,目的是為了把數跨不同表的資料,在不重複資源的情況下繫結在一起。下面的 employees 表中,employee id ...