zoukankan      html  css  js  c++  java
  • 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来替代;
    

      

     

     

  • 相关阅读:
    The formatter threw an exception while trying to deserialize the message in WCF
    通过Web Deploy方式部署WCF
    The Managed Metadata Service or Connection is currently not available
    How to create Managed Metadata Column
    冒泡算法
    asp.net core 实战项目(一)——ef core的使用
    Vue学习笔记入门篇——安装及常用指令介绍
    Vue学习笔记入门篇——数据及DOM
    Vue学习笔记目录
    Chart.js在Laravel项目中的应用
  • 原文地址:https://www.cnblogs.com/coder-zyc/p/11718662.html
Copyright © 2011-2022 走看看