ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

mysql leftjoin 大表在外_小表驱动大表

2022-03-10 14:01:27  阅读:429  来源: 互联网

标签:COMMENT 小表 DEFAULT mysql 驱动 NULL 大表


前言
在数据库查询中,经常用到表关联,听到最多的规则是 “小表驱动大表”。那么问题来了

什么是小表驱动大表 ?

为什么要用小表驱动大表 ?

怎么区分那个是驱动表与被驱动表 ?

JOIN 查询如何选择驱动表与被驱动表 ?

索引应该建在驱动表还是被驱动表 ?

  1. 什么是小表驱动大表 ?

小表驱动大表指的是用小的数据集驱动大的数据集。

  1. 为什么要用小表驱动大表 ?
    例如:现有两个表 A 与 B ,表 A 有 200 条数据,表 B 有 20 万条数据 ;
    按照循环的概念举个例子

小表驱动大表 > A 驱动表,B 被驱动表

for(200 条){for(20 万条){...}}
大表驱动小表 > B 驱动表,A 被驱动表

for(20 万){for(200 条){...}}
总结:

如果小的循环在外层,对于表连接来说就只连接 200 次 ;

如果大的循环在外层,则需要进行 20 万次表连接,从而浪费资源,增加消耗 ;

综上:
小表驱动大表的主要目的是通过减少表连接创建的次数,加快查询速度 。

  1. 怎么区分那个是驱动表与被驱动表 ?
    通过 EXPLAIN 查看 SQL 语句的执行计划可以判断在谁是驱动表,EXPLAIN 语句分析出来的第一行的表即是驱动表 ;

  2. JOIN 查询如何选择驱动表与被驱动表 ?
    在 JOIN 查询中经常用到的 inner join、left join、right join
    问题解答:

1.当使用 left join 时,左表是驱动表,右表是被驱动表 ;

2.当使用 right join 时,右表时驱动表,左表是驱动表 ;

3.当使用 inner join 时,mysql 会选择数据量比较小的表作为驱动表,大表作为被驱动表 ;

测试结论:

测试环境配置:MYSQL 5.7

数据准备:

创建两张测试表
大表 user_big_info ,测试数据 400 万条, 小表 user_small_info ,测试数据 200 万条 ;

CREATE TABLE `user_small_info` (  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',  `user_id` varchar(32) NOT NULL COMMENT '用户唯一标识',  `username` varchar(32) NOT NULL DEFAULT '' COMMENT '用户名',  `password` varchar(255) NOT NULL DEFAULT '' COMMENT '密码',  `real_name` varchar(32) NOT NULL DEFAULT '' COMMENT '真实姓名',  `phone` varchar(32) NOT NULL DEFAULT '' COMMENT '手机号码',  `remarks` varchar(255) NOT NULL DEFAULT '' COMMENT '备注',  `status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '状态 1-启用 2-禁用 ',  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',  PRIMARY KEY (`id`),  UNIQUE KEY `uniq_user_id` (`user_id`) USING BTREE,  KEY `idx_username` (`username`) USING BTREE) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='用户表';

LEFT JOIN 测试

小表驱动大表

执行时间:18.141s ,由于使用左连接以小表为主表所以,返回行数:200 万
执行计划

大表驱动小表

执行时间:25.949s ,由于使用左连接以大表为主表所以,返回行数: 400 万
执行计划

结论:

当使用 left join 时,左表是驱动表,右表是被驱动表 ; ;

在执行效率上,小表驱动大表优于大表驱动小表 ;

驱动表索引没有生效,被驱动表索引有效 ;

INNER JOIN 测试
小表驱动大表

执行时间:18.660s ,等值连接返回行数:200 万

执行计划

大表驱动小表

执行时间:19.060s ,等值连接返回行数:200 万

执行计划

结论:

当使用 inner join 时,数据库会选择数据量比较小的表作为驱动表,大表作为被驱动表 ;

在执行效率上,那个作为主表关系不大,执行效率差距不大 ;

驱动表索引没有生效,被驱动表索引有效 ;
————————————————
版权声明:本文为 CSDN 博主「weixin_39634876」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_39634876/article/details/111698250

标签:COMMENT,小表,DEFAULT,mysql,驱动,NULL,大表
来源: https://www.cnblogs.com/DougallDev/p/15989192.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有