sql优化整理(二)

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

LEFT JOIN 条件用于肯定如何从右表搜索行,左边必定有,因此右边的关键是要创建索引;左链接索引加在右表;
RIGHT JOIN条件用于肯定如何从左表搜索行,右边必定有,左边的关键是创建索引;左表创建索引;

  

  关于慢查询分析的步骤mysql

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

  

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

  第一组循环数据库

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

  

  第二组循环缓存

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

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

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

 

  • 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;spa

 

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来替代;
相关文章
相关标签/搜索