一 什么是驱动表
   1)指定了联接条件时,满足查询条件的记录行数少的表为[驱动表];
   2)未指定联接条件时,行数少的表为[驱动表](Important!)。
   表现 explain第一行出现的就是驱动表
二  多表查询的分类
   1 多表join查询
   2 多表join+子查询
三 驱动表的分类
  1 单表
    单表执行顺序有2种情况
     1 单表先执行条件过滤,结算出结果再进行关联join
     2 单表先进行关联join,再结果进行条件过滤

可以根据explain驱动表的索引选择进行判断是根据哪种情况执行

1 选择条件索引,先过滤

2 选择连接字段索引,先关联
  2 派生表
    explain->type-><derived>名称 即为派生表

eg SELECT  column_list FROM (SELECT  column_list FROM table_1) derived_table_nameWHERE derived_table_name.column > 1

注意  执行的是 select from之后  where和join之前的语句
    执行顺序
   1 执行子查询的内容
   2 把子查询的结果写到临时表中
   3 回读,应用上层SELECT的WHERE条件
四 多表查询几点注意
  1 对驱动表可以直接排序,对非驱动表(的字段排序)需要对循环查询的合并结果(临时表)进行排序
  2 一旦连接字段没有应用索引,就会出现BNL字样,进行系统优化

五 多表查询优化
 1  永远用小结果集驱动大结果集(Important!)
 2  多表join的连接字段一定都要有索引
 3  多表join的排序一定选择驱动表
 4 注意出现派生表的情况,效率会很低(子查询)
 5 多表查询善用 STRAIGHT_JOIN,可以改变驱动表

6 采用join on而并非where a.id=b.id这种方式改写sql
六 通用优化原则
 增加索引->改写sql(通常将子查询改写成链接查询)

七  基础

1 为什么会选择驱动表数量小的表

1 驱动表 扫描为ALL  被驱动表拥有索引 那么时间复杂度为   N*2*log2M。

2 驱动表 扫描为index 被驱动表拥有索引 那么时间复杂度为  2*logN+N*2*log2M。

我们通过这个计算方式可以发现,N的变化率增幅远远高于M的变化率,所以需要N尽可能的减少

2  出现BNL会有什么后果

一旦被驱动表没有选择索引,就会选择BNL,将驱动表的bf放置在join_buffer中,如果结果集太大,那么会先处理一批,然后清空join_buffer.再进行填充,这样做的坏处就是整个LRU列表的old不断被刷新,挤占yang区,影响整体的命中率(请注意,分割多个block,会读取多次数据页,导致数据页被认为是活跃数据,但是实际对开发者来说只有一次)

3  mysql 5.6+ 对于索引查询的优化

参数 mrr_cost_based  = OFF ,因为现阶段的mysql优化器大多数情况下默认不选择MRR,所以需要关闭此参数,

传统过程: 传统情况下,表根据非主键索引访问主键,然后取得列数据,过程没有错,但是有个问题,辅助索引对应的主键索引可能是无序的,那么访问底层数据就并非顺序读.

优化过程: 1 MRR 根据辅助索引查询的主键不先进行查询,先把主键索引一起放置到缓存中,进行排序,然后再进行统一查找,将随机读变为顺序读. 缓存参数为 read_rnd_buffer_length 控制大小

2 BKA 根据驱动表查询的数据放入内存中,当内存满时,再进行与被驱动表的匹配,而之前是一条一条进行的匹配,缓存参数为join_buffer_size,这个参数同样也优化着BNL算法

开启命令 set optimizer_switch='mrr=on,mrr_cost_based=off,batched_key_access=on';

八 什么时候会用到临时表

1、UNION查询;

2、ORDER BY和GROUP BY的子句不一样时;

3、表连接中,ORDER BY的列不是驱动表中的;

4、DISTINCT查询并且加上ORDER BY时;

5、FROM中的子查询;

mysql 查询优化 ~ 多表查询基础知识的更多相关文章

  1. mysql 查询优化 ~ 多表查询改写思路

    一 简介:在之前我们从基础可知,现在咱们聊一下改写的几种思路二 分类:  1 left join  2 inner join  3 right join三 具体改写思路:思路1 本身不包含子查询,将多 ...

  2. Vc数据库编程基础MySql数据库的表查询功能

    Vc数据库编程基础MySql数据库的表查询功能 一丶简介 不管是任何数据库.都会有查询功能.而且是很重要的功能.上一讲知识简单的讲解了表的查询所有. 那么这次我们需要掌握的则是. 1.使用select ...

  3. MySQL系列(一)--基础知识大总结

    MySQL系列(一)---基础知识大总结 前言:本文主要为mysql基础知识的大总结,mysql的基础知识很多,这里只是作为简单的介绍,但是具体的细节还是需要自行搜索.当然本文还有很多遗漏的地方,后续 ...

  4. MySQL之多表查询一 介绍 二 多表连接查询 三 符合条件连接查询 四 子查询 五 综合练习

    MySQL之多表查询 阅读目录 一 介绍 二 多表连接查询 三 符合条件连接查询 四 子查询 五 综合练习 一 介绍 本节主题 多表连接查询 复合条件连接查询 子查询 首先说一下,我们写项目一般都会建 ...

  5. day15(mysql 的多表查询,事务)

    mysql之多表查询 1.合并结果集 作用:合并结果集就是把两个select语句查询的结果连接到一起! /*创建表t1*/ CREATE TABLE t1( a INT PRIMARY KEY , b ...

  6. day 39 MySQL之多表查询

    MySQL之多表查询   阅读目录 一 介绍 二 多表连接查询 三 符合条件连接查询 四 子查询 五 综合练习 一 介绍 本节主题 多表连接查询 复合条件连接查询 子查询 首先说一下,我们写项目一般都 ...

  7. [SQL]SQL Server数据表的基础知识与增查删改

    SQL Server数据表的基础知识与增查删改 由张晨辉(学生) 于19天 前发表 | 阅读94次 一.常用数据类型 .整型:bigint.int.smallint.tinyint .小数:decim ...

  8. 《JAVASCRIPT高级程序设计》表单基础知识和文本框脚本

    在HTML中,表单是由<form>元素来表示,在javascript中,表单对应的是HTMLFormElement类型,它具有一些独有的属性和方法: 一.表单基础知识 1.取得表单的方式 ...

  9. MySQL之单表查询 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER BY 八 限制查询的记录数:LIMIT 九 使用正则表达式查询

    MySQL之单表查询 阅读目录 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER B ...

随机推荐

  1. C regex.h

    C也是存在正则表达式的 Linux下regex.h知识点和使用样例 上文中有一个样例代码,进行了测试 总结一下有些注意点: 1.上述代码的匹配子串很奇怪,为什么会出现 cnt= a very cnt= ...

  2. 回流(reflow)与重绘(repaint)

    回流(reflow)与重绘(repaint) 很早之前就听说过回流与重绘这两个名词,但是并不理解它们的含义,也没有深究过,今天看了一套网易的题目,涉及到了这两个概念,于是想要把它们俩弄清楚... 一. ...

  3. POJ 3522 Slim Span(极差最小生成树)

    Slim Span Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 9546   Accepted: 5076 Descrip ...

  4. hystrix实战

    https://blog.csdn.net/Ezreal_King/article/details/72942823

  5. Linux 多线程 - 线程异步与同步机制

    Linux 多线程 - 线程异步与同步机制 I. 同步机制 线程间的同步机制主要包括三个: 互斥锁:以排他的方式,防止共享资源被并发访问:互斥锁为二元变量, 状态为0-开锁.1-上锁;开锁必须由上锁的 ...

  6. diff和patch

    diff -u:the unified format会将不同的地方放在一起,紧凑易读 . diff original.txt updated.txt c表示在original文件中的m,n行的内容将要 ...

  7. Linux设备树(二 节点)

    二 节点(node)的表示 首先说节点的表示方法,除了根节点只用一个斜杠“/”表示外,其他节点的表示形式如“node-name@unit-address”.@前边是节点名字,后边是节点地址.节点名字的 ...

  8. ZooKeeper集群详细安装教程

    1. 安装JDK 1.1 官网下载JDK 进入网址<a href="http://www.oracle.com/technetwork/java/javase/downloads/jd ...

  9. JavaSE_List&Array_Java1.7

    这里简单写了下List和Array的相互转换 package cn.rocker.collection.list; import org.junit.Test; import java.util.Ar ...

  10. java socket / No buffer space available

    s https://www.cnblogs.com/yiwangzhibujian/p/7107785.html Socket用在哪呢,主要用在进程间,网络间通信. https://www.cnblo ...