mysql 查询3级分类表_MySQL多表联表查询驱动表选择

联表查询做开发的小伙伴会经常使用,但是可以大家都比较少去深入了解MySQL是怎么执行多表联表查询的,比如怎么选择驱动表(第一个被处理的表),是先联表还是说先根据where条件(前提是有where条件)进行过滤后在进行联表搜索符合条件的结果,等等。那这个里面可能涉及到的知识点比较多,就不仅仅是今天要讨论的驱动表的选择,还需要小伙伴们去了解更多相关的知识,比如:索引 ICP,nestedloop算法等等。后面笔者将更新相关的文章,供小伙伴们参考。

1. 联表的类型

我们经常使用的多表连接类型有以下三类:
1) 左连接(left join)
2) 右连接(right join)
3) 内连接(inner join)
关于这三种连接的区别,笔者在这里就不多说了,不了解的小伙伴们可以查阅相关的资料。
下面针对这三种连接分别做测试。

2.实践

在这里小伙伴们自己要准备两张表,笔者这里准备的是app,appext 这两张表,笔者这两张表比较复杂,这里就不全部展示出来了,需要注意的是笔者这里的mysql版本是8.0的。
1) 左连接和右连接
执行 explain select a.id,a.name,b.grade from app a left join appext b on a.id = b.appid; 其中a.id 是主键并且是自增的,appext 中的appid 与app.id 是关联的。输出结果如下:

74dff8f1e5ec13e2bc7c76b644e286c6.png

leftjoin.png

我们可以看到驱动表是我们的a表,下面我们改成right join 看下:
explain select a.id,a.name,b.grade from app a right join app
ext b on a.id = b.appid;

c59bcadd9ee59715792281af27be830d.png

rightjoin.png


可以看到mysql 选择了b表作为驱动表。
其实从上面的运行结果我们可以得出,左连接或者右连接的情况下是不管表中的记录数的,如果是左连接会选择左边的表作为驱动表,如果是右连接会选择右边的表作为驱动表。
2) 内连接
explain select a.id,a.name,b.grade from app a inner join app
ext b on a.id = b.appid;

输出结果如下:

c59bcadd9ee59715792281af27be830d.png

rightjoin.png


此时mysql 选择了b表作为了驱动表。下面我们再加些条件来看下运行结果:
explain select a.id,a.name,b.grade from app a inner join app
ext b on a.id = b.appid where a.name = '剑仙缘';

c59bcadd9ee59715792281af27be830d.png

rightjoin.png


我们看到mysql仍然是选择b表作为驱动表,我们再来单独分析下这条sql语句:
mysql > select count(id) from app where name = '剑仙缘';
+-----------+
| count(id) |
+-----------+
| 2 |
+-----------+
可以看到满足条件的记录实际上只有两行,下面使用explain 来看下这条语句的执行计划。
mysql > explain select id,name from app where name = '剑仙缘';

1200

explain.png

我们发现执行计划里面的rows仍然是需要扫描8137行数据,所以加上这个where条件并不能改变mysql所选择的驱动表。那如果where的条件是有索引的情况了,比如利用userid字段来检索,下图是笔者app数据表里面的索引:

d5cbbafd86b822b3e0bd292ff8e56ccb.png

表索引.png

mysql > explain select a.id,a.name,b.grade from app a inner join appext b on a.id = b.appid where a.userid= 1079;

c4195756dacd13efcb63c9140e9dff98.png

explain.png

我们发现此时mysql选择了a表作为了驱动表,我们再来单独分析下select id,name from app where userid = 1079;这条语句:
mysql > explain select id,name from app where user
id = 1079;

98e8f22de15bcfb5c7229ca3e180ecef.png

explain.png

我们发现此时mysql扫描的次数大大减少了,原因很简单,因为mysql利用了索引,所以无需全部扫描。总结:对于内连接mysql会选择扫描次数比较少的作为驱动表。

最后一点:我们从上面的测试结果中可以看出:当查询语句里面的where条件涉及到索引时,mysql会事先根据索引去过滤到一部分不符合条件的数据,然后再去和另外一张表的数据做匹配,反之,则会对全表进行扫描,等把所有的记录都查询出来再做过滤,这其实也是mysql内部做的一个优化-索引ICP,笔者将在后面的文章里面做详细的介绍。

好了,本篇文章就介绍到这里了,有不对的地方,欢迎小伙伴们指出,看到会及时回复的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL MySQL_思维导图.pdf 63.MySQL_主从复制.avi 62.MySQL_行锁总结.avi 61.MySQL_如何锁定一行.avi 60.MySQL_间隙锁危害.avi 59.MySQL_索引失效行锁变锁.avi 58.MySQL_行锁演示答疑补充.avi 57.MySQL_行锁案例讲解.avi 56.MySQL_行锁理论.avi 55.MySQL_读锁案例讲解2.avi 54.MySQL_读锁案例讲解.avi 53.MySQL_数据库锁理论概述.avi 52.MySQL_全局查询日志.avi 51.MySQL_用Show Profile进行sql分析.avi 50.MySQL_批量插入数据脚本.avi 49.MySQL_慢查询日志.avi 48.MySQL_为排序使用索引OrderBy优化.avi 47.MySQL_in和exists.avi 46.MySQL_小驱动.avi 45.MySQL_索引优化答疑补充和总结口诀.avi 44.MySQL_索引面试题分析.avi 43.MySQL_索引优化10.avi 42.MySQL_索引优化9.avi 41.MySQL_索引优化8.avi 40.MySQL_索引优化7.avi 39.MySQL_索引优化6.avi 38.MySQL_索引优化5.avi 37.MySQL_索引优化4.avi 36.MySQL_索引优化3.avi 35.MySQL_索引优化2.avi 34.MySQL_索引优化1.avi 33.MySQL_索引三优化案例.avi 32.MySQL_索引两优化案例.avi 31.MySQL_索引单优化案例.avi 30.MySQL_explain之热身Case.avi 29.MySQL_explain之Extra介绍.avi 28.MySQL_explain之rows介绍.avi 27.MySQL_explain之ref介绍.avi 26.MySQL_explain之key_len介绍.avi 25.MySQL_explain之possible_keys和key介绍.avi 24.MySQL_explain之type介绍.avi 23.MySQL_explain之select_type和table介绍.avi 22.MySQL_explain之id介绍.avi 21.MySQL_explain使用简介.avi 20.MySQL_性能分析前提知识.avi 19.MySQL_哪些情况不适合建索引.avi 18.MySQL_哪些情况适合建索引.avi 17.MySQL_索引结构与检索原理.avi 16.MySQL_索引分类和建索引命令语句.avi 15.MySQL_索引优势劣势.avi 14.MySQL_索引是什么.avi 13.MySQL_七种JOIN的SQL编写.avi 12.MySQL_七种JOIN理论.avi 11.MySQL_SQL执行加载顺序.avi 10.MySQL_SQL性能下降原因.avi 09.MySQL_存储引擎简介.avi 08.MySQL_MySQL逻辑架构简介.avi 07.MySQL_MySQL配置文件.avi 06.MySQL_修改字符集.avi 05.MySQL_安装位置.avi 04.MySQL_ROOT密码设置和开机自启动.avi 03.MySQL__RPM安装.avi 02.MySQL_MySQL简介.avi 01.MySQL_课程简介.avi
MySQL是一个真正的多用户、多线程SQL数据库服务器。SQL(结构查询语言)是世界上最流行的和标准化的数据库语言,它使得存储、更新和存取信息更加容易。MySQL是一个客户机/服务器结构的实现,它由一个服务器守护程序mysqld和许多不同的客户程序以及库组成的。 MySQL的主要目标是快速、健壮和易用。最初是因为MySQL的创始人需要这样的一个SQL服务器,它能处理与任何不昂贵硬件平台上提供数据库的厂家在一个数量上的大型数据库,但速度更快,MySQL因此就开发出来了。 它提供C,C++,Java(JDBC),Perl,Python,PHP and TCL 的API接口;多平台支持,包括Solaris,SunOS,BSDI,SGI IRIX,AIX,DEC UNIX,Linux,FreeBSD,SCO OpenServer,NetBSD,OpenBSD,HPUX,Win9x and NT;多样的数据类型,包括有/无符号1,2,3,4,8字节integers,FLOAT,DOUBLE,CHAR,VARCHAR,TEXT,BLOB,DATE,DATETIME,YEAR,SET,ENUM;非常灵活和安全的权限系统,密码加密;为Windows提供ODBC接口,可通过Access与之相联,另有第三方开发商提供多样的 ODBC驱动程序;在MySQL 3.23中使用新MyISAM最大的大小可达8百万 TB(2^63个字节);多种语言支持,但不支持中文。 然而,为了实现快速、健壮和易用的目的,MySQL必须牺牲一部分灵活而强大的功能,如子查询、存储过程与触发器、外键、事物处理等。因而,MySQL在某些应用中缺乏灵活性,但这也使它对数据的处理速度较其它数据库服务器至少快2~3倍。 MySQL自身不支持Windows的图形界面,因此,所有的数据库操作及管理功能都只能在MS-DOS方式下完成。首先,必须登陆MySQL服务器,即在提示符/MySQL/BIN>下输入MYSQL –H host –U user –Ppassword,提示符改为mysql>时示登陆成功。然后,选择所操作的数据库,即mysql> USE databasename。接着就可以用SQL语句进行查询了。如果需要退出数据库服务器,可执行QUIT命令,这样就成功退出服务器了。 当然,由于MySQL的知名度日益增加,许多第三方软件公司推出了MySQL在Windows环境中的具有图形界面的支持软件,如EMS公司的EMS MYSQL MANAGER就提供了Windows形式的MySQL数据库操作功能。 转帖于 Xue163.com_MySQL

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值