首页 > 数据库 >MySQL多表查询优化

MySQL多表查询优化

时间:2024-09-12 09:05:53浏览次数:1  
标签:语句 多表 UNION 查询 MySQL Join 连接

一、多表查询连接的选择:

相信这内连接,左连接什么的大家都比较熟悉了,当然还有左外连接什么的,基本用不上我就不说了。然后要告诉大家的是,需要根据查询的情况,想好使用哪种连接方式效率更高。

二、MySQL的JOIN实现原理

在MySQL 中,只有一种Join 算法,就是大名鼎鼎的Nested Loop Join,他没有其他很多数据库所提供的Hash Join,也没有Sort Merge Join。顾名思义,Nested Loop Join 实际上就是通过驱动表的结果集作为循环基础数据,然后一条一条的通过该结果集中的数据作为过滤条件到下一个表中查询数据,然后合并结果。如果还有第三个参与Join,则再通过前两个表的Join 结果集作为循环基础数据,再一次通过循环查询条件到第三个表中查询数据,如此往复。 ——摘自《MySQL 性能调优与架构设计》

三、补充:mysql对sql语句的容错问题

即在sql语句不完全符合书写建议的情况,mysql会允许这种情况,尽可能解释它:

1)一般cross join后面加上where条件,但是用cross join+on也是被解释为cross join+where;

2)一般内连接都需要加上on限定条件,如上面场景一;如果不加会被解释为交叉连接;

3)如果连接表格使用的是逗号,会被解释为交叉连接;

注:sql标准中还有union join和natural inner join,mysql不支持,而且本身也没有多大意义,其实就是为了“健壮”。但是其实结果可以用上面的几种连接方式得到。

三、超大型数据尽可能尽力不要写子查询,使用连接(JOIN)去替换它:

当然,关于这句话,也不一定就全是这样。

1)因为在大型的数据处理中,子查询是非常常见的,特别是在查询出来的数据需要进一步处理的情况,无论是可读性还是效率上,这时候的子查都是更优。

2)然而在一些特定的场景,可以直接从数据库读取就可以的,比如一个表(A表 a,b,c字段,需要内部数据交集)join自己的效率必然比放一个子查在where中快得多。

四、使用联合(UNION)来代替手动创建的临时表

UNION是会把结果排序的!!!

union查询:它可以把需要使用临时表的两条或更多的select查询合并的一个查询中(即把两次或多次查询结果合并起来。)。在客户端的查询会话结束的时候,临时表会被自动删除,从而保证数据库整齐、高效。使用union来创建查询的时候,我们只需要用UNION作为关键字把多个select语句连接起来就可以了,要注意的是所有select语句中的字段数目要想同。

要求:两次查询的列数必须一致(列的类型可以不一样,但推荐查询的每一列,相对应的类型要一样)

可以来自多张表的数据:多次sql语句取出的列名可以不一致,此时以第一个sql语句的列名为准。

如果不同的语句中取出的行,有完全相同(这里表示的是每个列的值都相同),那么union会将相同的行合并,最终只保留一行。也可以这样理解,union会去掉重复的行。

如果不想去掉重复的行,可以使用union all。

如果子句中有order by,limit,需用括号()包起来。推荐放到所有子句之后,即对最终合并的结果来排序或筛选。

注意:

1、UNION 结果集中的列名总是等于第一个 SELECT 语句中的列名

2、UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同

UNION ALL的作用和语法:

默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。

五、总结

(1)对于要求全面的结果时,我们需要使用连接操作(LEFT JOIN / RIGHT JOIN / FULL JOIN);

(2)应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:

20201206160028060.jpeg

备注、描述、评论之类的可以设置为 NULL,其他最好不要使用NULL。

不要以为 NULL 不需要空间,比如:char(100) 型,在字段建立时,空间就固定了, 不管是否插入值(NULL也包含在内),都是占用 100个字符的空间的,如果是varchar这样的变长字段, null 不占用空间。

可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:

select id from t where num = 0

(3)in 和 not in 也要慎用,否则会导致全表扫描,如:

20201206160028096.jpeg

对于连续的数值,能用 between 就不要用 in 了:

20201206160028133.jpeg

很多时候用 exists 代替 in 是一个好的选择:

20201206160028179.jpeg

(4)尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连 接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。

(5)尽量使用表变量来代替临时表。如果表变量包含大量数据,请注意索引非常有限(只有主键索引)。

(6)不要以为使用MySQL的一些连接操作对查询有多么大的改善,其实核心是索引

标签:语句,多表,UNION,查询,MySQL,Join,连接
From: https://www.cnblogs.com/shujuyr/p/18409491

相关文章

  • MySQL学习笔记(二)InnoDB内存模型与磁盘同步机制
    InnoDB存储引擎ACID是我们在数据库设计的时候,尽可能的去满足的设计原则。A原子性、C一致性I隔离性D持久性,其中InnoDB存储引擎就是满足了我们ACID设计原则的。内存缓存结构(BufferPool)如果每次获取数据都去磁盘获取,这样效率明显比较慢。所以innoDB为了性......
  • 【Conan 教程】Conan远程仓库管理:添加、删除、查询与包下载
    目录标题第一章:使用Conan绑定和删除远程仓库1.1Conan的远程仓库概述1.1.1绑定远程仓库添加新的远程仓库绑定成功后输出:1.1.2删除远程仓库删除远程仓库的步骤:删除后的输出:1.1.3Conan的远程仓库优先级1.2结论第二章:查看远程仓库中的包2.1查询远程仓库中的包2......
  • 【重学 MySQL】二十五、等值连接vs非等值连接、自连接vs非自连接
    【重学MySQL】二十五、等值连接vs非等值连接、自连接vs非自连接等值连接(Equijoin)vs非等值连接(Non-equijoin)等值连接(Equijoin)非等值连接(Non-equijoin)自连接(Self-join)vs非自连接(Non-self-join)自连接(Self-join)非自连接(Non-self-join)总结在MySQL中,连接(J......
  • 【重学 MySQL】二十四、笛卡尔积的错误和正确的多表查询
    【重学MySQL】二十四、笛卡尔积的错误和正确的多表查询笛卡尔积的理解和错误笛卡尔积的理解定义例子在数据库中的应用总结笛卡尔积的错误正确的多表查询使用INNERJOIN使用WHERE子句(隐式内连接)总结在数据库查询中,特别是涉及到多表查询时,理解笛卡尔......
  • MySQL原理之UUID主键分析,插入或更新语法分析
    目录1MySQL不能用UUID做主键1.1前言1.2mysql和程序实例1.2.1准备工作1.2.2开始测试1.2.3程序写入结果1.2.4效率测试结果1.3使用uuid和自增id的索引结构对比1.3.1自增id1.3.2uuid1.4自增id缺点1.5雪花算法2插入或更新2.1onduplicatekey2.1.1定义2.1.2values函数2......
  • HTB-Oopsie(越权漏洞,suid提权,js接口查询插件)
    前言各位师傅大家好,我是qmx_07,今天给大家讲解Oopsie靶机渗透过程信息搜集服务器开放了22SSH端口和HTTP80端口FindSomething插件介绍:帮助寻找网站的js接口,辅助渗透通过js接口查找,发现目录/cdn-cgi/login登录接口通过游客模式登录越权登录访问uploads文件......
  • DBeaver 连接 mysql 报错:Public Key Retrieval is not allowed
    前言DBeaver连接mysql报错:PublicKeyRetrievalisnotallowed遇到"PublicKeyRetrievalisnotallowed"错误时,通常意味着你正在使用的身份验证方法需要加密连接,但是没有正确地配置客户端或服务器来支持这种加密。解决第一种可以在连接字符串中添加allowPublicKeyRe......
  • mysql 连接失败:message from server: "Host '192.168.xx.xxx' is not allowed to conn
    前言mysql连接失败:messagefromserver:"Host'192.168.xx.xxx'isnotallowedtoconnecttothisMySQLserver"解决错误信息表明你尝试从IP地址192.168.xx.xxx连接到MySQL服务器,但是该IP地址没有被授权连接权限。为了解决这个问题,你需要确保你的MySQL用户权限......
  • Linux 安装MySQL
    前言:根据对应的系统位数,选择需要下载的文件。查看系统位数getconfLONG_BIT一、下载MySQL1.手动去官网下载官网地址:MySQL::DownloadMySQLCommunityServer(ArchivedVersions)2.Linux命令下载通过Linux命令下载:wgethttps://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-对......
  • 后台查询数据渲染前端
    后台代码:@GetMapping("/getAll")//多层封装多条信息查询用listpublicResultgetAll(){Listlist=userService.getAdmin();returnResult.success(list);}publicListgetAdmin(){returnadminDao.selectAll();}params类@DatapublicclassParams{privateStr......