sql优化整理(二)

  对于连接查询,EXPLAIN的extra字段出现using join buffer,表示使用了连接缓存,保证JOIN语句中被驱动表上JOIN条件字段已经添加索引;

LEFT JOIN 条件用于确定如何从右表搜索行,左边一定有,所以右边的关键是要建立索引;左连接索引加在右表;
RIGHT JOIN条件用于确定如何从左表搜索行,右边一定有,左边的关键是建立索引;左表建立索引;

  

  关于慢查询分析的步骤

1.开启慢查询日志,设置阈值,比如超过5秒就是慢sql,并将它抓出来
2.explain+慢sql分析
3.show profile查询sql在mysql服务器里面的执行细节和生命周期等
4.sql数据库服务器的参数调优

  

  小表驱动大表的解释,下面有两组循环;

  第一组循环

for (int i = 5; ..) {
    for(int j = 1000;...) {
    }
}

  

  第二组循环

for (int i = 1000;..) {
    for (int j = 5; ...) {
    }
}

  上面两组循环,都是循环了5000次;对于数据库而言,第一组循环比较好,因为第一组循环总共就创建了5个连接,不用频繁的创建连接,释放连接;

  小表驱动大表,意思是小的数据集驱动大的数据集;

  • EXISTS

select * from A where id in (select id from B)
--  等价于:
-- for select id from B
-- for select * from A where A.id = B.id

  当B的数据集必须小于A表的数据集时,用 in 优于 exists;

select * from A where exists (select 1 from B where B.id = A.id)
-- 等价于:
-- for select * from A
-- for select * from B where B.id = A.id

  当A表的数据集小于B表的数据集时,用exists优于in;

  注意: A表与B表的字段id应建立索引;

SELECT ... FROM table WHERE EXISTS(subquery)
将主查询的数据,放到子查询中做条件验证,根据验证结果(TRUE 或FALSE)来决定主查询的数据结果是否保留;
EXISTS(subquery) 只返回TRUE或FALSE,因此子查询中的SELECT * 也可以时select 1 或select 'x',官方说法是实际执行时会忽略SELECT清单,因此没有区别;
EXISTS子查询的实际执行过程可能经过了优化而不是我们理解的逐条对比,如果担忧效率问题,可进行实际校验以确定是否有效率问题;
EXISTS子查询往往也可以用条件表达式,其他子查询或JOIN来替代;

  

 

 

原文地址:https://www.cnblogs.com/coder-zyc/p/11718662.html