一、为什么要用小表驱动大表
1、驱动表的定义
当进行多表连接查询时, [驱动表] 的定义为:
1)指定了联接条件时,满足查询条件的记录行数少的表为[驱动表]
2)未指定联接条件时,行数少的表为[驱动表](Important!)
2、mysql关联查询的概念:
MySQL 表关联的算法是 Nest Loop Join,是通过驱动表的结果集作为循环基础数据,然后一条一条地通过该结果集中的数据作为过滤条件到下一个表中查询数据,然后合并结果。
例: user表10000条数据,class表20条数据
select * from user u left join class c u.userid=c.userid
这样则需要用user表循环10000次才能查询出来,而如果用class表驱动user表则只需要循环20次就能查询出来
例:
select * from class c left join user u c.userid=u.userid
小结果集驱动大结果集
优化的目标是尽可能减少JOIN中Nested Loop的循环次数
保证:永远用小结果集驱动大结果集(Important)!
=========================总结===========================
1.开启慢查询日志,设置阀值,比如超过5秒就是慢SQL,并把它抓取出来。
2.explain+慢SQL 分析
3.show profile 查询SQL在MySQL服务器里面的执行细节和声明周期。
- SQL数据库服务器的参数调优。