首页 > 数据库技术 > 详细

sql优化整理(二)

时间:2019-10-22 12:29:52      阅读:73      评论:0      收藏:0      [点我收藏+]

  对于连接查询,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来替代;

  

 

 

 

sql优化整理(二)

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!