进行连接查询时,先保证待连接表的 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';
)