一 什么是驱动表
   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中的子查询;

九 多表联合 索引失效场景

1 join连接 两张表的字符集分别为utf8和 utf8mb4,或者指定了特殊字符集的列

2 join连接使得单表查询的联合索引在多表join中失效

转载于:https://www.cnblogs.com/danhuangpai/p/10307824.html

mysql 查询优化 ~ 多表查询基础知识相关推荐

  1. MySQL单表查询基础卷(A)

    MySQL单表查询基础卷(A) 第一章 数据准备 第二章 数据展示 第三章 题目说明 第四章 参考答案 第一章 数据准备 -- 创建数据库,指定字符集 utf8 CREATE DATABASE IF ...

  2. mysql表deptno,MySQL:多表查询

    MySQL:多表查询 SELECT查询不但可以从一张表查询数据,还可以从多张表同时查询数据.查询多张表的语法是:SELECT * FROM 表1 表2,普通多表查询会获取M x N行记录,所以一般使用 ...

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

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

  4. mysql怎样两表查询_mysql怎样两表查询?

    mysql两表查询的方法:1.使用"select 字段列表 from 表1,表2 [where 条件]"进行查询:2.使用"SELECT 字段列表 FROM 表1 关键字 ...

  5. mysql数据库多表查询(内连接,外连接,自连接,子查询及案例分析)

    mysql数据库多表查询 之前接触的项目或者自己涉及的部分对于多表查询的使用都比较的少,常常是自己更具案例进行学习,最近见到的比较的多,所以今天就好好的总结一下,为下一步学习做准备! 1.多表查询关系 ...

  6. MySQL数据库多表查询

    MySQL数据库多表查询 前言 在之前的文章MySQL数据库之SQL入门中,我们讲到了四类SQL中的DQL(数据库查询语言,用于查询表中数据),但是我仅仅用DQL去查询一张表中数据,而在实际的应用中, ...

  7. mysql的联表查询和去重复数据

    mysql的联表查询和去重复数据 /* SQLyog Ultimate v10.00 Beta1 MySQL - 5.7.17-log : Database - pusmtnew ********** ...

  8. Mysql的交叉表查询

    最近由于找工作,所以在恶补PHP和Mysql方面的东西,发现还是学习的不够.这几天看到关于mysql的交叉表查询的内容,根据自己的理解简单的尝试了下. 由于MonsterHunter World较火, ...

  9. 二十、哈希表的基础知识

    哈希表是什么? 定义:根据设定的哈希函数H(key)和处理冲突的方法,将一组关键字映射到一个有限的连续的地址集(区间)上,并以关键字在地址集中的"像"作为记录在表中的存储位置,这种 ...

最新文章

  1. JNI的native代码中打印日志到eclipse的logcat中
  2. python万年历_Python实现的简单万年历例子分享
  3. location 和 history
  4. 莫比乌斯带catia建模_独家教程 | 循环曲面“莫比乌斯”,康石石教你Rhino“3步”快速打造...
  5. netatalk,轻松将linux变成你的Mac File Server!!!
  6. matlab常用的代码,matlab常用代码
  7. maven的一些依赖
  8. 基于SSM的单点登陆01
  9. 爬取天涯帖子(单个帖)
  10. #GeekPoint# 苹果的 AR 眼镜
  11. win7配置maven环境变量
  12. 在线人数的统计方法。
  13. Linux上安装和卸载Redis实例教程
  14. 实木餐桌四大保养方法,90%的人都不知道
  15. ROS驱动乐视相机(LeTMC-520)并获取图像(RGB和RGBD)
  16. 线程池内运行的线程抛异常,线程池会怎么办
  17. 欧姆龙NX/NJ系列PLC,气缸FB块分享下载,多功能全方位气缸控制FB块
  18. 国开《个人理财》形成性考核作业任务1-3
  19. 湖南大学计算机学院陈浩,陈浩(湖南大学信息科学与工程学院教授)_百度百科...
  20. linux网络存储备份,备份基础:Linux异构网络共享光盘刻录(下)

热门文章

  1. python2转python3代码_2to3 - 自动将 Python 2 代码转为 Python 3 代码
  2. 桌面消息提醒_手机消息总是延迟,真的是网速不行?3招教你找出捣鬼设置
  3. 移动端设备常用尺寸笔记
  4. 夏日清凉小风扇网站源码 抖音引流神器
  5. 移动开发在路上-- IOS移动开发系列 多线程二
  6. Application.Goto 方法
  7. 深入理解JavaScript系列:根本没有“JSON对象”这回事!
  8. PHP利用FPDI 制作PDF 档案 (php合并pdf, php签名pdf)
  9. 使用 jQuery Mobile 与 HTML5 开发 Web App (四) —— jQuery Mobile 表单上
  10. jQuery时间轴插件:jQuery Timelinr