对于连接查询,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优化整理(二)的更多相关文章

  1. SQL语句整理(二) 数据定义语言DDL

    前言: 这是我学数据库时整理的学习资料,基本上包括了所以的SQL语句的知识点. 我的教材是人大王珊老师的<数据库系统概论>. 因为是手打的,所以会用一些细节打错了,但都挺明显也不多(考完试 ...

  2. 关于sql优化整理一下

    1.where 子句中可以对字段进行 null 值判断吗?        可以,比如 select id from t where num is null 这样的 sql 也是可以的.但是最好不要给数 ...

  3. sql优化整理(一)

    sql的编写语法是这样的: SELECT DISTINCT <select_list> FROM <left_table> <join_type> JOIN < ...

  4. SQL知识整理二:锁、游标、索引

    锁 锁的模式 锁模式 描述 共享(S) 用于不更改或不更新数据(只读操作),如SELECT语句 更新(U) 用于可更新的资源中.防止当多个会话在读取.锁定以及随后可能进行的资源更新时发生常见形式的死锁 ...

  5. Sql优化(二) 快速计算Distinct Count

    原创文章,始发自本人个人博客站点,转载请务必注明出自http://www.jasongj.com 个人博客上本文链接http://www.jasongj.com/2015/03/15/count_di ...

  6. oracle存储过程及sql优化-(二)

    接下来比较重要,我会先贴出一个存储过程,根据这个存储过程讲解 PROCEDURE AP_CXBB_GT3_SBFGL_SBFYJSQC (OUT_RECORD OUT SYS_REFCURSOR, P ...

  7. SQL优化汇总

    今天面某家公司,然后问我SQL优化,感觉有点忘了,今天特此总结一下: 总结得是分两方面:索引优化和查询优化: 一. 索引优化: 1. 独立的列 在进行查询时,索引列不能是表达式的一部分,也不能是函数的 ...

  8. Spring+SpringMVC+MyBatis+easyUI整合优化篇(十二)数据层优化-explain关键字及慢sql优化

    本文提要 从编码角度来优化数据层的话,我首先会去查一下项目中运行的sql语句,定位到瓶颈是否出现在这里,首先去优化sql语句,而慢sql就是其中的主要优化对象,对于慢sql,顾名思义就是花费较多执行时 ...

  9. sql优化点整理

    此文是我最早开始sql优化至今整理的小知识点和经常遇到的问题,弄懂这些对优化大型的sql会有不少帮助 ---------------------------------使用了多余的外连接------- ...

随机推荐

  1. JVM七大垃圾回收器下篇G1(Garbage First)

    G1回收器:区域化分代式 既然我们已经有了前面几个强大的GC,为什么还要发布Garbage First (G1)GC?  原因就在于应用程序所应对的业务越来越庞大.复杂,用户越来越多,没有GC就不能保 ...

  2. 部署cobbler服务器

    部署cobbler服务器 1.准备环境使用nat或者仅主机模式,不要使用桥接模式,方式获取的IP不是自己的 2. 配置yum源[epel]name=epelenabled=1gpgcheck=0bas ...

  3. springboot、Thymeleaf、国际化的简单使用

    1.项目体系结构 (1)知识体系 springboot:省去了很多繁琐的配置,如:视图解析器.前端控制器等 thymeleaf:获取controller数据逼能够进行展示 集合:用于存储数据,此练习没 ...

  4. git个人常用命令

    git https://www.cnblogs.com/chenwolong/p/GIT.html 添加当前目录的所有文件到暂存区 $ git add . 提交暂存区到仓库区 $ git commit ...

  5. java关键字static和final

    static可以修饰变量,方法或者类(普通类是不能用static修饰的,只能用来修饰内部类) static静态变量又称之为类变量(和c++中的全局变量概念是一样的),在类加载后,jvm只为类变量分配一 ...

  6. 基于Scrapy的交互式漫画爬虫

    Github项目地址 前言 该项目始于个人兴趣,本意为给无代码经验的朋友做到能开箱即用 阅读此文需要少量Scrapy,PyQt 知识,全文仅分享交流 摘要思路,如需可阅读源码,欢迎提 issue 一. ...

  7. Ajax接收int类型乱码

    在Ajax返回值类型是 "text" 的时候,接收int类型时可能会出现ၧ 解决方法:将int转为String即可 int money =100; String s = Integ ...

  8. 051 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试——debug入门1

    051 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试--debug入门1 本文知识点: 程序调试--debug入门1 程序 ...

  9. c++中CString:: Find , ReverseFind, Left, Right

    CString 是在MFC中的头文件 非MFC加上afx.h头文件 直接上代码: // ConsoleApplication1.cpp : Defines the entry point for th ...

  10. vue中,使用 es6的 ` 符号给字符串之间换行

    我这里分功能是点击"复制范围",就相当于复制图上的坐标点一样的数据和格式: "复制功能"的代码如下: copyPoints() { const vm = thi ...