Mysql为何不推荐写多表SQL

news2025/7/7 2:51:22

前言

  1. 在大部分情况下,单表并不是比多表快
  2. 单表优势在于理解成本与可控性
  3. 有时候你觉得单表SQL不好写的时候,你改更新的是表结构

现状

在我们学习MySql的路程之中,估计不少人告诫我们不要写长语句。
至于为什么,确实很少人提起。
下面我们就拿现状做例子 ,
我们再次拿图书馆系统的老三张表作为例子,会有些改动的只不过我们给这些表增添了一些小细节

图书表

在这里插入图片描述

用户表

在这里插入图片描述

用户阅读历史记录表

在这里插入图片描述

两种查询的效率

关于查询的效率,大家可以从上篇文章之中看到具体过程,这里不再复述。 (主要懒得再写一遍)
上一篇文章

主要的结论便是,其实对于一条查询语句来说,无论我们写哪种语句。效率都是相差无几的(大部分情况下)
(从严谨上来说,甚至多表联查是更加节省资源,快速的一种方法。但是,这种节省资源的“方式” , 并不会影响核心速率 )

所以,如果只是为了速度,这个并不是劝谏他人的理由

问题

假设,我们现在遇见一个问题。

我们需要实现一个报表,主要查询条件为

  1. 书本ISBN号,可一次性输入十个 (必选)
  2. 用户手机号,可一次性输入十个(必选)
  3. 根据用户等级进行筛选
  4. 根据图书类型进行筛选
  5. 根据借阅时间倒序

那么复合SQL的查询逻辑是什么样的呢


SELECT * FROM t_r_book_history bh 
	LEFT JOIN t_a_user u ON bh.user_id = u.id 
	LEFT JOIN t_a_book b ON bh.book_id = b.id 
WHERE 
	bh.record_flag = 1 
	AND b.id IN `#{isbn}`
	AND b.book_type = 1
	AND u.user_id IN `#{userIdList}`
	AND u.user_rank = 1
ORDER BY bh.release_time DESC LIMIT 10;

使用单表查询的SQL是什么呢?


SELECT user_id FROM t_a_user WHERE id IN `#{isbn}` and user_rank=1;

SELECT book_id FROM t_a_book WHERE user_id IN `#{userIdList}` and book_tyoe=1;

SELECT * from t_r_book_history WHERE record_flag=1 and user_id IN (`#{userIdList}`) AND book_id IN `#{bookIdList}` ORDER BY release_time LIMIT 10;

从运行速度上来说 , 使用单表查询不如多表联查
但是,你能说的清除多表查询的运行逻辑吗?
对于不同版本的SQL,对于多表联查。他有着自己的优化器。他会自己去制定一个执行计划,在某些更加复杂的情况下。便经常会出现无法执行某个表的索引的情况
(对于某些业务,经常出现一个屏幕都装不下的SQL )
但是对于单表查询来说, 他的运行逻辑是透明的,可读的,更加容易理解的。未来的自己,后续的开发人员,都能更加容易的读懂,此刻写下代码的你

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/7168.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2.6 用一套万能文案公式来拆解4个小红书爆文案例【玩赚小红书】

公式细分人群他们的痛点数字干货分享情感共鸣 我们一个一个来看。 ​ ​ 一、《9平次卧小房间,再见了传统榻榻米(附户型图)》 家装类:避坑/攻略/小价钱装出大效果/装修效果拔群 标题直接点出了目标人群的需求:如何…

XSS进阶之CSP绕过

目录预备知识实验目的实验环境实验步骤一实验步骤二实验步骤三预备知识 1.了解Javascript、PHP和CSP的一些特性,比如“strict-dynamic”。 2.CSP:实质就是白名单制度,它规定哪些外部资源可以加载和执行。它的实现和执行全部由浏览器完成。资…

python实战指西<1>pygame安装,以及vscode

目录 1,安装pygame 1.1,(如果前一个没反应的化) 1.2如果飘红字 1,检查是否开了网络代理(不要开) 2,检查是否有pip模块更新需要 2.这里顺便记录一下vscode 蛇蛇的环境搭载 2.1首…

Postgresql实验系列(4)SIMD提升线性搜索性能24.5%(附带PG SIMD完整用例)

概要 接上一篇《Postgresql引入SIMD指令集》 PG引入SIMD执行集后具体有多大性能提升?本篇抽取PG的simd库,对比线性搜索场景的性能: 测试场景(文章最后提供完整程序) 构造一个存有14亿数字的数组 uint32 cnt 14100…

【python3】3.函数、类、模块

2022.11.15 本学习内容总结于莫烦python:3.函数、类、模块 https://mofanpy.com/tutorials/python-basic/interactive-python/function1. Function 函数 我常会重复写一些功能,比如查询文件时间,查询文件名字等等.后续我只需要引用到这个功能&#xff0…

Flink架构重要概念解析-超详理解

文章目录💎 1.1 系统架构1.1.1 整体构成1.1.2 作业管理器(JobManager)1.1.3 任务管理器(TaskManager)🚀1.2 作业提交流程1.2.1 高层级抽象视角1.2.2 独立模式(Standalone)1.2.3 YARN…

网页数据采集系统-怎样利用爬虫爬网站数据

随着社会不停地发展。人们也是越来越离不开互联网,今天小编就给大家盘点一下免费的网页数据采集系统,只需要点几下鼠标就能轻松爬取数据,不管是导出excel还是自动发布到网站都支持。详细参考图片一、二、三、四! 企业人员 通过爬…

【直播预告】相机模型与标定——Real world超级公开课

导言 《Realworld超级公开课》是奥比中光3D视觉开发者社区打造的品牌活动之一,聚焦于3D视觉传感技术。每期课程邀请奥比中光及生态合作伙伴的技术专家,以线上线下相结合的授课形式,面向高校与人工智能企业的开发者,分享3D视觉技术…

线程的“结束”

【一道概率很高的面试题】: 如何优雅的结束一个线程? 上传一个大文件,正在处理费时的计算,如何优雅的结束这个线程呢? 【stop方法】: 【为何不建议使用stop呢?】: 因为很容易产生…

【附源码】计算机毕业设计JAVA成绩分析系统

【附源码】计算机毕业设计JAVA成绩分析系统 目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: JAVA mybati…

ORA-01940 无法删除当前已连接的用户之解决方案(脚本)

第一部分:配置数据库连接 1. 安装ODBC yum -y install unixODBC unixODBC-devel 2. 安装Oracle-instantclient #以下所有操作使用root账号执行 #创建目录 mkdir -p /opt/oracle cd /opt/oracle #下载odbc安装包 wget https://download.oracle.com/otn_software…

计算机毕业设计ssm+vue基本微信小程序的好物推荐分享系统

项目介绍 我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,好物分享系统小程序被用户普遍使用,为方便用户能够可以随时进行好物分享系统小程序的数据信息管理,特开发了基于好物分…

做食品能入驻Lazada吗?带你解锁东南亚当地热销及需求食品系列

中国的电商领域已经趋于饱和状态,中国食品电商领域已经呈现出存量的趋势了,例如:良品铺子、三只松鼠、百草味、口水娃、盼盼等国内知名品牌已经占比了国内大部分的市场份额,跟着巨头抢市场 无疑是很难的,那么中国这么多…

红外线热像仪的热成像质量介绍

摘要 毫无疑问,你在过去几年的某个时候,购买了数位相机来更换旧的胶卷相机。你的购买可能受到你的信念的影响,即在尝试判断提供的所有相机选择之间的图像质量时,像素数是最重要的规格。 任何阅读过消费者报告及其对数位相机的详…

CVE-2020-1472-ZeroLogon复现

CVE-2020-1472-ZeroLogon复现 简介 Netlogon使用的AES认证算法中的vi向量默认为0,导致攻击者可以绕过认证,同时其设置域控密码的远 程接口也使用了该函数,导致可以将域控中保存在AD中的管理员password设置为空 影响版本 Windows Server 2…

大牛耗时两年完成的实战手册。Elasticsearch实战,掌握这些刚刚好!

记得刚接触Elasticsearch的时候,没找啥资料,直接看了遍Elasticsearch的中文官方文档,中文文档很久没更新了,一直都是2.3的版本。最近又重新看了遍6.0的官方文档,由于官方文档介绍的内容比较多,每次看都很费…

10.基础备份与时间点恢复

目录 基础备份 时间点恢复 时间线 基础备份与时间线都是为了时间点恢复。 基础备份 基础备份的目的是备份当前的数据库集簇的快照,结合归档日志一起可以恢复至任意的时间点。 基础备份通过pg_start_backup命令开始为基础备份做准备,它会: 强制进行整…

[附源码]java毕业设计基于web的停车收费管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

dot net 杂谈之一

文章目录一、使用vscode开发.net core程序二、创建解决方案三、反射3.1 反射应用场景一3.2 反射应用场景二一、使用vscode开发.net core程序 安装如下插件: 1、vscode-solution-explorer 2、.NET Core Extension Pack 3、搜索nuget工具包并安装 二、创建解决方案…

股票l2数据接口中的逐单跟逐笔是什么意思?

股票l2数据接口中的逐单跟逐笔是什么意思? 【逐单统计】是按成交委托单资金流转情况来统计,特大资金买卖差大单资金买卖差中单资金买卖差小单资金买卖差0。是双向统计,对于每单交易同时统计买卖双方,一定程度上反应了资金在不同类…