進行連接查詢時,先保證待連接表的 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';
)