首页 > 数据库 >MySQL性能优化之 - 单表查询+代码层拼接 VS 表连接查询

MySQL性能优化之 - 单表查询+代码层拼接 VS 表连接查询

时间:2023-09-14 14:37:34浏览次数:32  
标签:缓存 数据库 查询 VS 单表 MySQL 代码

单表查询+代码端拼接的优势

记得当初单位派我去阿里交流学习时,人家就说,在阿里,95%以上的查询都是单表查询,虽然我们都知道单表查询更加符合MySql底层的算法逻辑,但是单表查询+代码端拼接的优势究竟是什么,它为什么互联网企业都会使用单表查询呢?归纳而言大体分以下几点:

1. 激活代码端和数据库缓存

首先是代码端缓存,各位小伙伴应该都知道,在 .NET 框架中有很多ORM框架,比如我们最熟悉的EFCore就是其中的佼佼者。我们在使用它对数据库进行查询时,如果单条数据没有发生变化,那么此时就会使用EFCore的缓存来返回查询结果。MySQL也有自己的缓存机制。但是一旦数据发生了变化,则不能再使用之前的缓存。而由于表连接查询可能会一次性关联多张表,只要其中一张表发生变化,那么整个缓存就将失效。如果是分步的单表查询,显然更容易触发缓存。

2. 避免“一锁具锁”的情况

在数据库中会有一种叫做锁竞争的东西存在,如果我们做了表连接查询,那么只要其中任意一个表被锁,那么整个查询都将出现问题。反之单表查询可以最大限度的避免出现“一锁具锁”的情况。

3. 减少MySql的哈希关联

在MySql大致有两种索引方式,一种叫做BTree(其实是B+树的进化版,统称BTree),这种形式的索引非常利于范围查询的优化,这里有机会我们课上细聊。

null

那么还有一种方式叫做Hash,这种方式适合单个数据查询,而不适合连续查询,对于查询效率会产生一定的影响

null

我们知道,就算要使用表连接查询,阿里也有硬性要求,就是必须要走索引,那么这样做相当于在应用中实现了哈希关联,而不是在MySQL中进行的嵌套循环连接,效率会更高。

4. 提高代码复用

除了以上数据库本身的原因,在开发过程中,单表的查询可以被多次重复使用。

5. 更加符合DDD思想开发

现阶段由于微服务架构大行其道,与之相应的DDD领域驱动思想也颇为热门。在DDD领域驱动思想中就有一个聚合根的概念,此时我们可以利用领域服务获取关联数据,再以领域事件聚合数据。

这里还缺少一个连表查询时,会产生笛卡尔积的消耗,这个中间结果集对大数据集很不友好,分分钟干爆你的内存;

不使用join的条件之一,就是大数据集千万不要用,还有存在分库分表的时候,如果你有这种想法,看大佬怎么收拾你;

不使用join的原因和好处:

1、降低MySQL优化器的负担,可以让优化过程快速收敛;

2、SQL简单,便于优化,更好的命中索引;

3、查询数据集小,便于缓存(包括数据库、ORM)

4、由于有缓存,可以减少磁盘IO

5、一个东西修改的概率可能不是很高,一堆东西修改的概率相对来讲会高一些,数据一旦修改,缓存就没有意义了;

6、复杂SQL容易满足死锁条件,造成不同的SQL锁定资源的循序不一致,且执行时间长,死锁的概率相对较高,尽量要做到轻量、无锁并发;

7、由于简单、标准,很多地方可以重复使用,避免重复造轮子,这种精华部分可以交给大佬处理;

8、所有的一切都是可控,且性能输出稳定;

9、数据库是所有系统的瓶颈,需要保证数据库高频低延时的对外稳定输出,就像Redis我们通常不希望有大key,不希望使用模糊匹配一样;

10、方便数据异构、迁移、拆分,不会因为这些操作而导致系统不正常;

标签:缓存,数据库,查询,VS,单表,MySQL,代码
From: https://www.cnblogs.com/kkbk/p/17702380.html

相关文章

  • SQL基础总结(七):子查询
    本系列blog源自前年写的SQL学习笔记,汇总一下发上来。(1月份发了前三篇笔记,原以为后面的笔记误操作删了,今天在硬盘里又找到了,一起发上来)--------------------------------不要在子查询中使用ORDERBY子句,子查询返回的中间结果是看不到的,对子查询排序没有意义。子查询是单个SELECT......
  • P-Core vs E-Core
    P-Core在英特尔的两种不同核心布局中,P-Core是芯片上最强的核心。这些将消耗最多的能量,以最高的时钟速度运行。P-Core通常会处理较重的任务,例如游戏或更重的处理负载,以及通常受益于单核性能的其他工作负载。而过去,英特尔芯片上的内核全部相同时,PC的所有指令均等分配在所有......
  • Citrix SQL数据库查询和替换修改字段
    1如下图,右键指定库新建查询即可2粘贴底部代码后,如下,点击执行查询即可--查看Citrix站点数据库如下表内容字段select*fromchb_config.Controllers;select*fromADIdentitySchema.Services;select*fromHostingUnitServiceSchema.Services;select*fromAppLibrarySchem......
  • ExecutorService VS Timer
    IhavecodewhereIscheduletaskusingjava.util.timer.IwaslookingaroundandsawExecutorServicecandothesame.Sothisquestionhere,haveyouusedTimerandExectuorServicetoscheduletasks,whatisthebenefitofoneusing......
  • Mysql慢查询优化
    Mysql慢查询优化实战效果:效率提升十倍左右优化前mysql>usetest_old;Databasechangedmysql>setprofiling='ON';QueryOK,0rowsaffectedmysql>showvariableslike'profiling';+---------------+-------+|Variable_name|Value|+--------......
  • 2、关于索引的二次查询
    聚集索引VS非聚集索引(B+树)超级详细讲解【字节跳动大佬】(MySQL索引-B+树(看完你就明白了)-苍青浪-博客园(cnblogs.com))在上节介绍B+树索引的时候,我们提到了图中的索引其实是聚集索引的实现方式。那什么是聚集索引呢?在MySQL中,B+树索引按照存储方式的不同分为聚集索引和......
  • 嵌套查询
    nested子文档在ES内部其实也是独立的lucene文档,只是我们在查询的时候,ES内部帮我们做了类似数据库的join处理。最终看起来好像是一个独立的文档一样。如果一个订单,有1000个订单项,那么在ES中存在的文档数就是1001,会随着订单数的增加而成倍上升。那可想而知,同样的条件下,这个......
  • 升讯威在线客服系统的并发高性能数据处理技术:PLINQ并行查询技术
    我在业余时间开发维护了一款免费开源的升讯威在线客服系统,也收获了许多用户。对我来说,只要能获得用户的认可,就是我最大的动力。最近客服系统成功经受住了客户现场组织的压力测试,获得了客户的认可。客户组织多名客服上线后,所有员工同一时间打开访客页面疯狂不停的给在线客服发消......
  • Node.js vs. Spring Boot:Hello World 性能对决,谁更快一点?
    前言:SpringBoot在Java生态中备受欢迎,它是一款基于Java构建的轻量级服务端框架,主要用于Web服务。SpringBoot的应用使得创建各类基于Spring的企业级应用变得异常简单。Node.js作为一种基于ChromeV8引擎的JavaScript运行时环境,在服务端上运行JavaScript代码。它以其独......
  • SQL Server 远程跨数据库服务器查询、导入数据(SQL)
    /*1、创建链接服务器查询*/--创建链接服务器execsp_addlinkedserver'remote_server','','SQLOLEDB','远程服务器名或ip地址'execsp_addlinkedsrvlogin'remote_server','false',null,'用户名','密码'--查询示例......