MySql数据库单表查询与多表连接查询效率对比

作者:不会编程的派大星 时间:2024-01-26 12:28:05 

这段时间在做项目的过程中,遇到一个模块,数据之间的联系很复杂,在建表的时候就很纠结,到底该怎么去处理这些复杂的数据呢,是单表查询,然后在业务层去处理数据间的关系,还是直接通过多表连接查询来处理数据关系呢?

通过查阅资料和阅读博客,有以下两个回答:

一、《高性能mysql》中的回答

很多高性能的应用都会对关联查询进行分解。简单地,可以对每个表进行一次单表查询,然后将结果在应用程序中进行关联。例如,下面这个查询:


select * from tag
join tag_post on tag_post.tag_id=tag.id
join post on tag_post.post_id=post.id
where tag.tag='mysql';

可以分解成下面这些查询来代替:


Select * from tag where tag='mysql';
Select * from tag_post where tag_id=1234;
Select * from post where id in(123,456,567,9989,8909);

到底为什么要这样做?

咋一看,这样做并没有什么好处,原本一条查询,这里却变成了多条查询,返回结果又是一模一样。

事实上,用分解关联查询的方式重构查询具有如下优势:(高并发、高性能的应用中,一般建议使用单表查询)
1. 让缓存的效率更高。许多应用程序可以方便地缓存单表查询对应的结果对象。另外对于MySQL的查询缓存来说,如果关联中的某个表发生了变化,那么就无法使用查询缓存了,而拆分后,如果某个表很少改变,那么基于该表的查询就可以重复利用查询缓存结果了。

2. 将查询分解后,执行单个查询可以减少锁的竞争。

3. 在应用层做关联,可以更容易对数据库进行拆分,更容易做到高性能和可扩展。

4. 查询本身效率也可能会有所提升。

5. 可以减少冗余记录的查询。

6. 更进一步,这样做相当于在应用中实现了哈希关联,而不是使用MySQL的嵌套环关联,某些场景哈希关联的效率更高很多。

7. 单表查询有利于后期数据量大了分库分表,如果联合查询的话,一旦分库,原来的sql都需要改动。

8. 上次看到某个CTO技术分享,公司规定底层禁止用join联合查询。数据大的时候确实慢。

9. 联合查询或许确实快,但是mysql的资源通常比程序代码的资源紧张的多。

二、其他的一些回答

情景假设:假设网站有一个公司库版块,我想搜索某城市的所有公司。

数据表:tbl_company (t1)、 tbl_city (t2)。

例1:

t1表中存cityid 根据id做表连接查询

select * from t1 inner join t2 on t1.cityid=t2.cityid;

例2:

t1表中存cityName 用户前台点击上海市,则把上海市的id传到后台(不考虑传cityName),

根据id查出cityName select cityName from t2 where cityid= #{cityid};

然后 select * from t1 where cityName = #{cityName};

两者区别:例1中只做了一次表关联查询,例2中分别做了两次单表查询。

考虑到数据量大,多表连接查询会影响查询效率所以都优化为单表查询。 TP:以上是在不使用索引的情况下

请问哪种效率会更高些?

答:sql优化与业务也有关系,这条语句的查询会不会频繁,要不要考虑2次连接带来的开销,如果这些都不用考虑的话,都没有索引的情况下,感觉相差不大,2应该略优于1。

数据没有特别大的情况还是级联查询快。

对于传统的数据库涉及来说, 尽可能减少数据库查询次数.

BUT, 1. mysql都对处理连接/断开连接, 回复小而简单的 查询是非常快的; 2.现在的网络已经非常快了. 所以多个小的查询对mysql来说可能更快一些.

最后, 大神也没有结论哪个更好. 呵呵, 其实整本书都明确表达一个意思, 测试测试! 做benchmark! 对于自己的数据环境, 把两种方式都测试一下. 用数据说话.

三、总结

个人建议还是用单表查询!在应用层做数据之间的关联会更好!

来源:https://blog.csdn.net/weixin_45827693/article/details/118094163

标签:MySql,查询效率
0
投稿

猜你喜欢

  • python使用Plotly绘图工具绘制柱状图

    2021-10-05 00:22:34
  • python中ImageTk.PhotoImage()不显示图片却不报错问题解决

    2023-08-26 18:12:06
  • Python import用法以及与from...import的区别

    2021-06-13 14:23:51
  • Python常用模块之requests模块用法分析

    2023-12-30 15:11:49
  • CSS实例讲解:地图提示

    2007-05-11 17:04:00
  • keras用auc做metrics以及早停实例

    2022-04-19 03:55:12
  • SQL Server可写脚本和编程扩展SSIS包

    2009-01-20 16:29:00
  • Python Django框架设计模式详解

    2021-01-16 12:52:40
  • Python Logging 日志记录入门学习

    2022-05-17 14:48:39
  • mysql 插入优化

    2010-12-14 15:29:00
  • 利用Python实现一个简易的截图工具

    2023-08-07 08:50:03
  • XHTML1.0与HTML兼容指引16条[译]

    2009-06-10 14:45:00
  • Oracle下时间转换在几种语言中的实现

    2009-02-28 11:09:00
  • 如何利用Python解析超大的json数据(GB级别)

    2023-03-22 12:08:21
  • 使用PHP生成二维码的两种方法(带logo图像)

    2023-11-14 11:00:30
  • 详解Python装饰器

    2023-11-12 12:40:06
  • git验证线上的版本是否符合预期

    2023-03-04 16:24:09
  • PHP爬虫框架盘点

    2023-06-10 07:10:12
  • java使用mysql预编译语句查询优势及示例详解

    2024-01-13 21:15:00
  • javascript设计模式 – 桥接模式原理与应用实例分析

    2024-04-26 17:12:09
  • asp之家 网络编程 m.aspxhome.com