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来替代;
    

      

     

     

  • 相关阅读:
    人人学IoT 助学思维导图
    基于netty4.x开发时间服务器
    JAVA实现的截屏程序
    java获取硬盘ID以及MAC地址
    神经网络joone_engin模式识别示范,eclipse
    神经网络/人工智能 开源库
    双目测距
    OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波
    一个java 开源神经网络引擎 joone
    用Java开源项目JOONE实现人工智能编程
  • 原文地址:https://www.cnblogs.com/coder-zyc/p/11718662.html
Copyright © 2011-2022 走看看