一 什么是驱动表
   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. android studio adb.exe已停止工作(全面成功版 进程的查询和开启)

    先输入adb看是否存在. 如果不存在则:在系统path里添加C:\Users\nubia\AppData\Local\Android\sdk\platform-tools 因为这个目录里有adb 或者 ...

  2. Circular view path xxx would dispatch back to the current handler URL,Check your ViewResolver setup

    Circular view path xxx would dispatch back to the current handler URL 通过原因分析,造成问题有两个因素:1). 缺省转发, 2). ...

  3. HTTP之Content-Type

    前言:HTTP/1.1 HTTP/1.1 协议规定的 HTTP 请求方法有OPTIONS.GET.HEAD.POST.PUT.DELETE.TRACE.CONNECT 这几种. 其中 POST 一般用 ...

  4. Kubernetes的负载均衡问题(Nginx Ingress)

    nginx 反向代理 https://www.cnblogs.com/ericnie/p/6965091.html Kubernetes 集群中使用 Traefik https://blog.csdn ...

  5. Linux sys_call_table变动检测

    catalogue . 引言 . 内核ko timer定时器,检测sys_call_table adress变动 . 通过/dev/kmem获取IDT adress . 比较原始的系统调用地址和当前内 ...

  6. 解决gitk显示文件内容中文乱码

    解决gitk显示文件内容中文乱码 1.git config 命令 设置git gui的界面编码 git config --global gui.encoding utf-8 2.修改配置文件 在~\e ...

  7. JDBC-C3P0

    一.依赖 pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&quo ...

  8. PHPMYWIND4.6.6前台Refer头注入+后台另类getshell分析

    下载链接 https://share.weiyun.com/b060b59eaa564d729a9347a580b7e4f2 Refer头注入 全局过滤函数如下 function _RunMagicQ ...

  9. 2018牛客网暑期ACM多校训练营(第一场)A Monotonic Matrix(LGV)

    题意 分析 考虑01和12的分界线是(n, 0)到(0,m)的两条不相交(可重合)路径分界线以及分界线以上的点是一种,分界线下是一种平移其中一条变成(n-1, -1)到(-1,m-1); 此时起点为{ ...

  10. solr简介与安装

    solr简介: Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器.Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置.可扩展,并对索引 ...