MySql小表驱动大表

mysql小表驱动大表 小表驱动大表原理 阅读详情

有的时候我们在操作数据库时会将两个或多个数据表关联起来通过一些条件筛选数据,在关联表时我们要遵循一些原则,这样会使我们编写的SQL 语句在效率上快很多。

一、优化原则

小表驱动大表,即小的数据集驱动大得数据集。在知道什么是小表驱动达大表之前,我们先来了解两个查询关键字,IN与 EXISTS。我们通过两段查询语句先来了解一下它们的作用。我建立了两张表,一张员工表,一张部门表,员工表中有部门id 这个属性,将这两张表关联起来。

我们先使用IN 来查询数据:

SELECT * 
FROM t_emp 
WHERE dept_id IN (SELECT dept_id FROM t_dept) 
LIMIT 5;

查询结果:由于有很多的员工信息,在这里我就只查询5 条数据。

+-------------+----------+------------+--------------+---------+
| emp_id      | emp_name | emp_gender | emp_email    | dept_id |
+-------------+----------+------------+--------------+---------+
| 00000000177 | 41d80    | m          | 41d80@zc.com |       1 |
| 00000000178 | a74b8    | m          | a74b8@zc.com |       1 |
| 00000000179 | 661ca    | m          | 661ca@zc.com |       1 |
| 00000000180 | 9413d    | m          | 9413d@zc.com |       1 |
| 00000000181 | 7d577    | m          | 7d577@zc.com |       1 |
+-------------+----------+------------+--------------+---------+

接下里使用EXISTS 来查询数据:

 SELECT * 
 FROM t_emp 
 WHERE EXISTS 
     (SELECT 1 
     FROM t_dept 
     WHERE t_dept.dept_id = t_emp.dept_id) 
 LIMIT 5;
  • 与上面的结果一样。
+-------------+----------+------------+--------------+---------+
| emp_id      | emp_name | emp_gender | emp_email    | dept_id |
+-------------+----------+------------+--------------+---------+
| 00000000177 | 41d80    | m          | 41d80@zc.com |       1 |
| 00000000178 | a74b8    | m          | a74b8@zc.com |       1 |
| 00000000179 | 661ca    | m          | 661ca@zc.com |       1 |
| 00000000180 | 9413d    | m          | 9413d@zc.com |       1 |
| 00000000181 | 7d577    | m          | 7d577@zc.com |       1 |
+-------------+----------+------------+--------------+---------+

既然IN 和 EXISTS 都可以用来查询数据,那它们两个有什么区别呢?

SELECT * 
FROM t_emp 
WHERE dept_id IN 
    (SELECT dept_id 
    FROM t_dept);

// 这条SQL 语句相当于:
for SELECT dept_id FROM t_dept
    for SELECT * FROM t_emp WHERE t_emp.dept_id = t_dept.dept_id

这里虽然我们编写的SQL 语句是主查询员工信息,子查询部门id ,但是MySql 的执行顺序会先执行子查询,再执行主查询,然后获得我们要查询的数据。

 SELECT * 
 FROM t_emp 
 WHERE EXISTS 
     (SELECT 1 
     FROM t_dept 
     WHERE t_dept.dept_id = t_emp.dept_id);

// 这条SQL 语句相当于:     
for SELECT * FROM t_emp 
    for SELECT * FROM t_dept  WHERE t_dept.dept_id = t_emp.dept_id          

我们可以将EXISTS 语法理解为:将主查询的数据放在子查询中做条件验证,根据结果TRUE 和 FALSE 来决定主查询中的数据是否需要保留。EXISTS 子查询只返回TRUE 或 FALSE ,因此子查询中的SELECT * 可以是SELECT 1 或者其他,MySql 的官方说在实际执行时会忽略SELECT 清单,因此是没有 什么区别的。EXISTS 子查询其实在执行时,MySql 已经对它做了一些优化并不是对每条数据进行对比。

二、总结

在实际操作过程中我们要对两张表的dept_id 都设置索引。在一开始我们就讲了一个优化原则即:小表驱动大表,在我们使用IN 进行关联查询时,通过上面IN 操作的执行顺序,我们是先查询部门表再根据部门表查出来的id 信息查询员工信息。我们都知道员工表肯定会有很多的员工信息,但是部门表一般只会有很少的数据信息,我们事先通过查询部门表信息查询员工信息,以小表(t_dept)的查询结果,去驱动大表(t_emp),这种查询方式是效率很高的,也是值得提倡的。

但是我们使用EXISTS 查询时,首先查询员工表,然后根据部门表的查询条件返回的TRUE 或者 FALSE ,再决定员工表中的信息是否需要保留。这不就是用大的数据表(t_emp) 去驱动小的数据表小的数据表(t_dept)了吗?虽然这种方式也可以查出我们想要的数据,但是这种查询方式是不值得提倡的。

当t_emp 表中数据多于 t_dept 表中的数据时,这时我们使用IN 优于 EXISTS。当t_dept 表中数据多于 t_emp 表中的数据时(我们这里只是假设),这时我们使用EXISTS 优于 IN。因此是使用IN 还是使用EXISTS 就需要根据我们的需求决定了。但是如果两张表中的数据量差不多时那么是使用IN 还是使用 EXISTS 差别不大。

【MySQL】小表驱动大表 1.概述 前言:本来小表驱动大表的知识应该在前面就讲解的,但是由于之前并没有学习数据批量插入,因此将其放在这里。在查询的优化中永远小表驱动大表。 1.为什么要小表驱动大表呢 类似循环嵌套 for(int i=5;.......) { for(int j=1000;......) {} } 如果小的循环在外层,对于数据库连接来说就只连接5次,进行5000次操作,如果1000在外,则需要进行1000次数据库连接,从而浪费资源,增加消耗。这就是为什么要小表驱动大表。 2.数据准备 根据My. 阅读详情

相关推荐

金蝶K3系统物料主数据后台表对应字段一览

我们说到物料表,一般是指t_icitem,但正确的说t_icitem并不是一张有,而是一张视图,不过我们对于数据库物料表中的大部分操作,都是通过此视图来完成。比如经常通过此视图,来成批修改数量,单价精度,是否启用批次等一些字段,有的时候,对于账套已经启用,并且已经有业务发生的物料,有一些关键属性也需要通过修改物料表t_icitem来进行。 当然修改的时候,需要考虑一些前提条件的。 比如说我有一个客户新建的账套,在月底结账时发现,要改一种成本核算方法,启用时用的是加权平法,现在想改成移动平均法,这样的情况,

hzfw2008的博客 1万+

Mysql之小表驱动大表

Mysql之小表驱动大表1 什么是小表驱动大表2 为什么使用小表驱动大表3 判断驱动表与非驱动表4 Exists和in的使用场景 1 什么是小表驱动大表 用小的数据集去驱动(可理解为匹配)大的数据集 2 为什么使用小表驱动大表 表A有20条数据,表B有20万数据.外部执行一次连接,内部要执行多次. ​ 按照小表驱动大表,即A驱动B for(20条){ for(20万条){ } } ​ 大表驱动小表,即B驱动A for(20万){ for(20条){ } } 小的循环在外层,表连接需要20次

ABestRookie的博客 1万+

RAG 赋能客服机器人:多轮对话与精准回复

在人工智能技术飞速发展的今天,客服机器人已成为企业提升服务效率的重要工具。然而,传统客服系统在多轮对话连贯性和精准回复能力上存在明显短板。检索增强生成(Retrieval-Augmented Generation, RAG)技术通过结合大语言模型(LLM)与外部知识库,为解决这一问题提供了创新路径。本文将深入探讨 RAG 在客服机器人中的应用,重点分析其如何实现多轮对话与精准回复,并结合实际案例与技术框架展开讨论。

shuizhudan223的博客 2143

常用的SQL优化!!!

常见的sql优化方式或思路:①以小表驱动大表②避免使用 select *③Union 和 Union all ,如果需要用到,尽量选择Union all...

m0_52256357的博客 1586

GitHub漏洞挖掘与CVE提交实战指南:从发现到编号的完整链路

GitHub开源项目是现代软件供应链的核心节点,其安全漏洞直接影响全球数百万系统的机密性、完整性与可用性。理解漏洞本质需回归CIA三元组原理,而真实可利用性依赖对协议解析层、配置加载区和依赖传递链等高危模块的精准识别。技术价值在于将模糊的‘可疑逻辑’转化为符合MITRE CVE标准的可验证事件,支撑SDL流程、威胁情报建设与供应链风险管理。典型应用场景包括甲方安全工程师推动供应商修复、独立研究者参与负责任披露,以及DevSecOps团队构建自动化风险坐标系。本文基于27次CVE提交经验,聚焦GitHub代码

weixin_33646989的博客 653

【Unity实战】实现最完美最简单的UI适配方案,背景压缩或者拉伸变形解决方案,手机刘海屏适配,适配不同分辨率,不同尺寸,不同设备。

这期来讲一个简单的UI设计方案,很多同学可能搞不懂锚点、轴心这些概念,导致做好的UI在别人的设备上,乱跑或者是重叠,或者是参加游戏老发时间比较紧来不及做适配,都可以来试试这个方法,通过填充边框来保持游戏画面的原始比例,所以它的缺点也很明显,在一些移动设备上会浪费比较大的显示面积。 unity不同设备UI变形? UI在不同设备上如何适配?

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 3655

sql优化常用技巧及理解

为什么小表驱动大表可以看这篇文章原则还是小表驱动大表 广为流传的说话: in和exists的连接方式驱动表不同假设 A 表是左表,B 表是子查询的表。当 A 表是大表, B 表是小表时,使用 in。select * from A where id in (select id from B) 当 A 表是小表, B 表是大表时,使用 exsits。(exists 后的子查询是被驱动的)– exists(subquery)只返回 true 或 false,官方也有说过实际执行时会忽略查询列。因此,select

qq_37436172的博客 1128

FlashBootloader01-基于UDS的Flash Bootloader【架构篇】

文章目录1 Flash Bootloader的依赖项2 Flash Bootloader中使用的UDS的主要功能3 Flash Bootloader更新固件3.1 初始化MCU3.2 刷写流程 1 Flash Bootloader的依赖项 通常Flash Bootloader由以下四方面组成: UDS协议 上位机「编写Bootloader Sequence」 通信驱动(如CAN ) Flash Driver 2 Flash Bootloader中使用的UDS的主要功能 1. 10 02服务 客户端

3592

MySQL实战45讲学习笔记----join原理与优化

join语句执行原理 NLJ,SNL,BNL,BKA算法 创建两个表t1和t2,存储过程idata()往表t2里插入了1000行数据,在表t1里插入的是100行数据。 CREATE TABLE `t2` ( `id` int(11) NOT NULL, `a` int(11) DEFAULT NULL, `b` int(11) DEFAULT NULL, PRIMARY K...

大魔王 1101

Spring AI Alibaba实战训练营-28 手把手教你用SAA+ Nacos 构建分布式 MCP 应用

本文介绍如何使用Spring AI Alibaba和Nacos构建分布式MCP应用,实现AI模型与工具服务的动态发现和调用。主要内容包括:1) 项目架构设计,包含MCP Server、Nacos注册中心和MCP Client三个核心组件;2) 环境准备要求,如Java 17+、Maven 3.6+、Nacos 3.1.0+等;3) 详细实施步骤:启动Nacos服务、注册MCP服务端、配置MCP网关聚合服务、设置MCP客户端发现机制。通过这种架构,开发者可以轻松扩展新工具服务,无需修改客户端代码,实现服务动态

program哲学 311

EndNote X9 参考文献附录列表 格式调整

EndNote X9 插入参考文献常见问题总结

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 2570

Mysql 小表驱动大表原则

摘要: 数据库表连接操作中,驱动表的选择直接影响查询性能。核心原则是优先选择过滤后结果集更小的表作为驱动表(小表驱动大表),而非仅看物理表大小。优化关键在于: 驱动表本质:决定外层循环次数,需结合WHERE条件评估过滤后的基数(Cardinality); 性能优化:通过减少I/O、提高缓存利用率、利用被驱动表索引(必须建立)来降低计算复杂度; 实践验证:使用EXPLAIN分析执行计划,确保驱动表rows值小且被驱动表使用索引访问。

qq_40873540的博客 1304

一、适配显示服务

基于rk3568适配显示服务,调动gpu;

XiaoC_Android的博客 1001

从MySQL小表驱动大表说起

a表有100条记录,b表有10000条记录,两张表做关联查询时,是将a表放前面效率高,还是b表放前面效率高?

zsah2011的博客 3303

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

mysql 大表 驱动_MySQL小表驱动大表

在了解之前要先了解对应语法 in 与 exist。in后的括号的表达式结果要求先输出一列字段。与之前的搜索字段匹配,匹配到相同则返回对应行。mysql的执行顺序是先执行子查询,然后执行主查询,用子查询的结果按条匹配主查询。exist后的括号里则无输出要求,exist判断后面的结果集中有没有行,有行则返回外层查询对应的行。ps所以exist还可以这样写: 用常量替换* ,反正是判断有没有行,不需要实...

weixin_30610943的博客 2079

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

MySQL高级知识(十六)——小表驱动大表

前言:本来小表驱动大表的知识应该在前面就讲解的,但是由于之前并没有学习数据批量插入,因此将其放在这里。在查询的优化中永远小表驱动大表。 1.为什么要小表驱动大表呢 类似循环嵌套 for(int i=5;.......) { for(int j=1000;......) {} } 如果小的循环在外层,对于数据库连接来说就只连接5次,进行5000次操作,如果1000在外,则需要进行1000次数据库连接,从而浪费资源,增加消耗。这就是为什么要小表驱动大表。 2.数据准备 根据MySQL高级知识

格子衫 908

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

MySQL连接算法和小表驱动大表的原理解析

本文介绍了MySQL中四种主要的连接算法:Nested Loop Join(NLJ)、Block Nested Loop Join(BNL)、Batched Key Access(BKA)和Hash Join。重点分析了小表驱动大表的核心优化原则,指出驱动表应选择结果集更小的表,而被驱动表连接字段必须有索引。不同算法下小表驱动大表的性能差异显著:NLJ/BKA必须小表驱动,Hash Join则无影响。文章还对比了不同MySQL版本对连接算法的支持优先级,并提供了如何识别和优化驱动表顺序的实用建议。

m0_59176231的博客 1010

Mysql小表驱动大表优化原理

摘要: MySQL优化中"小表驱动大表"原则的核心是通过减少嵌套循环连接(Nested Loop Join)的扫描次数提升性能。当小表(100行)驱动大表(1000万行)时,总扫描次数仅约100次;反之则达1000万次,效率相差10万倍。优化器基于表行数、索引情况等选择驱动表,建议将小表放JOIN前面、被驱动表连接字段建索引,并定期更新统计信息。特殊情况下该原则可能被打破,如强制指定驱动表或统计信息不准时。实际优化中可通过预过滤、临时表等方式处理极端大小表连接问题。

likuoelie的博客 793

mysql 小表左关联大表_MySQL关联查询时,我们为什么建议小表驱动大表?

有的时候我们在操作数据库时会将两个或多个数据表关联起来通过一些条件筛选数据,在关联表时我们要遵循一些原则,这样会使我们编写的SQL 语句在效率上快很多。一、优化原则小表驱动大表,即小的数据集驱动大得数据集。在知道什么是小表驱动达大表之前,我们先来了解两个查询关键字,IN 与 EXISTS。我们通过两段查询语句先来了解一下它们的作用。我建立了两张表,一张员工表,一张部门表,员工表中有部门id 这个属...

weixin_29113371的博客 3653

mysql 小表连大表_MySQL 表之间关联查询时,为什么建议小表驱动大表?

有的时候我们在操作数据库时会将两个或多个数据表关联起来通过一些条件筛选数据,在关联表时我们要遵循一些原则,这样会使我们编写的SQL 语句在效率上快很多。一、优化原则小表驱动大表,即小的数据集驱动大得数据集。在知道什么是小表驱动大表之前,我们先来了解两个查询关键字,IN 与 EXISTS。我们通过两段查询语句先来了解一下它们的作用。我建立了两张表,一张员工表,一张部门表,员工表中有部门id 这个属...

weixin_32771907的博客 3825

MySQL关联查询时,我们为什么建议小表驱动大表?

MySQL关联查询时,我们为什么建议小表驱动大表? 有的时候我们在操作数据库时会将两个或多个数据表关联起来通过一些条件筛选数据,在关联表时我们要遵循一些原则,这样会使我们编写的SQL 语句在效率上快很多。 一、优化原则 小表驱动大表,即小的数据集驱动大得数据集。在知道什么是小表驱动达大表之前,我们先来了解两个查询关键字,IN 与 EXISTS。我们通过两段查询语句先来了解一下它们的作用。我建立了两张表,一张员工表,一张部门表,员工表中有部门id 这个属性,将这两张表关联起来。 我们先使用IN 来查询数据:

bishe_teacher的博客 984

MySQL性能优化_小表驱动大表

类似循环嵌套} } 12345如果小的循环在外层,对于数据库连接来说就只连接5次,进行5000次操作;如果1000在外,则需要进行1000次数据库连接,从而浪费资源,增加消耗。这就是为什么要小表驱动大表。......

诗和远方,代码和你 579

Mysql 优化之小表驱动大表

hamov的专栏 3332

mysql 小表连大表_3.mysql小表驱动大表的4种表连接算法

小表驱动大表1、概念驱动表的概念是指多表关联查询时,第一个被处理的表,使用此表的记录去关联其他表。驱动表的确定很关键,会直接影响多表连接的关联顺序,也决定了后续关联时的查询性能。2、原则驱动表的选择遵循一个原则:在对最终结果集没影响的前提下,优先选择结果集最小的那张表作为驱动表。改变驱动表就意味着改变连接顺序,只有在不会改变最终输出结果的前提下才可以对驱动表做优化选择。外连接的顺序改变就很可能影响...

weixin_29016865的博客 1921

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

前言在数据库查询中,经常用到表关联,听到最多的规则是 “小表驱动大表”。那么问题来了什么是小表驱动大表 ?为什么要用小表驱动大表 ?怎么区分那个是驱动表与被驱动表 ?JOIN查询如何选择驱动表与被驱动表 ?索引应该建在驱动表还是被驱动表 ?1.什么是小表驱动大表 ?小表驱动大表指的是用小的数据集驱动大的数据集。2.为什么要用小表驱动大表 ?例如:现有两个表A与B ,表A有200条数据,表...

weixin_39634876的博客 1万+
上一篇: 解决Eclipse,MyEclipse出现An error has occurred,See error log for more details的错误
下一篇: 实现java 中 list集合中有几十万条数据,每100条为一组取出
一切还来得及
博客等级 码龄11年 50粉丝 19原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值