首页 > 数据库 >MySQL驱动表和被驱动表说明

MySQL驱动表和被驱动表说明

时间:2022-11-15 16:28:02浏览次数:41  
标签:语句 city join MySQL 说明 mysql 驱动 where

老男孩Linux运维MySQL中级DBA-第12章-MySQL驱动表和被驱动表说明-补

# 驱动表和被驱动表

#### 1.什么是驱动表和被驱动表?

在join连接查询中,驱动表在SQL语句执行的过程中总是先被读取。而被驱动表在SQL语句执行的过程中总是后被读取。在驱动表数据读取后,放入到join_buffer后,再去读取被驱动表中的数据来和驱动表中的数据进行匹配。如果匹配上则作为结果集返回,否则丢弃。

#### 2.学习驱动表和被驱动表有什么用?
在mysql的join连接语句优化中有用。

#### **3.如何区分驱动表和被驱动表**

(一)对于已有SQL语句,可使用explain查看SQL语句执行计划。
在输出的执行计划中,排在第一行的表是驱动表,排在第二行的表是被驱动表。

(二)join连接,根据连接类型确定哪个表是驱动表,哪个表是被驱动表:
没where条件时:
1.当使用left join时,左表是驱动表,右表是被驱动表
2.当使用right join时,右表是驱动表,左表是被驱动表
3.当使用join时,mysql会选择数据量**比较小的表作为驱动表**,大表作为被驱动表
https://blog.csdn.net/qq_20891495/article/details/93744495

**这里对于大小的判断,是指真正参与关联查询的数据量所占用的****join_buffer****的大小来区分的,而不是根据表中所有的数据行数来判断的。

有where条件时:
带where条件的是驱动表,否则是被驱动表

(三)优化器判断(可能不准,需要强制left指定)
mysql> desc select * from city join country on city.countrycode=country.code where city.population<100000 and country.SurfaceArea>10000000;

(四) 人为判断(结果集小的作为驱动表)

1.mysql>select count(*) from country where country.SurfaceArea>10000000;
+----------+
| count(*) |
+----------+
| 2 |
+----------+


mysql>select count(*) from city where city.population<100000 ;
+----------+
| count(*) |
+----------+
| 517 |
+----------+ 

补充: 如果where后的列中都有索引,会选择结果集小的作为驱动表.

#### 4.如何优化join语句查询
1)多表连接时,用小表驱动大表,驱动表创建索引时,mysql可能用不到。
2)在大表(被驱动表)上建立索引。
3)优化器会自动判断查询语句中的谁做为驱动表更合适.有可能会出现选择错误。
4)可以通过left join强制驱动表和被驱动表,从而干预执行计划。
5)多表联接并且有排序时,排序字段必须是驱动表里的,否则排序列无法用到索引;

标签:语句,city,join,MySQL,说明,mysql,驱动,where
From: https://www.cnblogs.com/oldboy666/p/16892774.html

相关文章

  • MySQL、Kafka(含zookeeper)、Redis的docker-composer文件
    以下docker-composer文件仅用于开发环境,快速搭建原型使用,生产环境,请进行针对性设置。MySQLversion:'3.1'services:db:image:mysql:8.0.28command:--d......
  • mysql动态新增字段
    使用PREPARE预处理语句动态新增字段,先判断表的字段是否存在,如果存在不新增,反之新增。--1.动态新增字段(储存过程);--结束符号DROPprocedureifEXISTSsp_add_col......
  • Centos7安装MySQL8.0-操作手册
    一.Mysql8.0.31安装(YUM方式)1)首先删除系统默认或之前可能安装的其他版本的mysql或者mairadb[[email protected]~]#foriin$(rpm-qa|grep-E"mysql|mariadb");dor......
  • logstash 同步mysql 到elasticsearch
    1.下载logstash要和es的版本一致 用的是7.17.6     下载地址:https://www.elastic.co/cn/downloads/past-releases#logstash2.配置  LS_JAVA_HOME  系......
  • mysql详细学习笔记
    连接与断开服务器mysql-h地址-P端口-u用户名-p密码mysql>SHOWPROCESSLIST;显示哪些线程正在运行+----+------+-----------+------+---------+------+----......
  • Word08 创新产品展示说明会邀请函office真题
    1.课程的讲解之前,先来对题目进行分析,首先需要在考生文件夹下,将Wrod素材.docx文件另存为Word.docx,后续操作均基于此文件,否则不得分。  2.这一步非常的简单,打开下载素材......
  • mysqld_safe Directory '/tmp/mysql' for UNIX socket file don't exists.
    报错版本:mysql-5.7.351、报错完整提示信息;[root@localhostbin]#2022-11-15T04:04:43.122905Zmysqld_safeLoggingto'/var/log/mysql.log'.2022-11-15T04:04:43.1......
  • GC日志打印添加以及说明
        项目经常自动重启,但是没有gc日志和dump文件。可以使用一下命令添加日志:    -XX:+PrintGCDetails-XX:+UseStringDeduplication-Xmx100M-XX:+UseG1G......
  • (初学)记一次dockercompose安装mysql8 以及问题
    docker-compose文件如下:1version:'3'2services:3#mysql服务4service-mysql:5image:docker.io/mysql:8.0.276command:7--def......
  • MySql小知识
    int类型​设计表的时候int(3)并不能限制取值范围和占用空间这个是int类型本身限制的例:int(3)在插入数据的时候1000也能插入成功(一版设计表的时候只填写类型,后面不加(X))......