用小结果集驱动大结果集,减少外层循环的数据量:
如果小结果集和大结果集连接的列都是索引列,
mysql
在内连接时也会选择用小结果集驱
动大结果集,因为索引查询的成本是比较固定的,这时候外层的循环越少,
join
的速度便
越快。
为匹配的条件增加索引:争取使用
INLJ
,减少内层表的循环次数
增大
join buer size
的大小:当使用
BNLJ
时,一次缓存的数据越多,那么外层表循环的
次数就越少
减少不必要的字段查询:
(
1
)当用到
BNLJ
时,字段越少,
join buer
所缓存的数据就越多,外层表的循环次数
就越少;
(
2
)当用到
INLJ
时,如果可以不回表查询,即利用到覆盖索引,则可能可以提示速度。
实例:
假设两张表
a
和
b
其中
b
的关联有
comments_id
,所以有索引。
1.join
使用的是
Index Nested-Loop Join
,先对驱动表
a
的主键筛选,得到一条,然后对非驱
动表
b
的索引进行
seek
匹配,预计得到一条数据。
下面这种情况没用到索引:
评论