知识卡片

数据库读取性能的三条经验法则

结构图卡

内容

读取数据的性能优化有三条经验法则。一,尽量一次读回多行,别为了拿到多行数据在同一张表上反复查询——”数据多了没关系”往往优于”数据不够精确要多次往返”,比如要拿50个人的数据,与其发50次独立查询,不如用一次能覆盖200个候选人的查询、再在内存里用逻辑筛出想要的50个,只是要留意悲观并发控制下一次锁太多行的风险。二,用联接(Join)在一次查询里跨表取数据,代价是记录集看起来会比较古怪,但能实打实提速;不过要记住数据库通常只优化到能高效处理一次查询里3~4个联接,超过这个数量会带来性能损失(可以靠缓存视图缓解)。三,这些法则终归只是指导,具体该怎么做必须结合自己的数据库和数据实测——数据库系统和应用服务器往往有复杂的缓冲机制,几乎每条经验法则都有让人意外的反例,值得花额外时间做性能剖析和调优,而不是死守通则。

结构图

flowchart TB
  A["数据库读取性能三法则"]
  A --> B["一次读回多行<br/>宁可数据冗余也别多次独立查询"]
  A --> C["用Join合并多表查询<br/>但联接数超3-4个反而损失性能"]
  A --> D["结合实际数据库实测<br/>通则常有反例,需剖析调优"]

参考来源

- 位置:《企业应用架构模式》第一部分"表述"之"第3章 映射到关系数据库"之"3.3 读取数据"(源文件:_epub-src/OEBPS/Text/000019.html) - 结论依据:原文说明"尽量一次读回多行……得到的数据多往往比得到的数据少好……另一个避免多次进入数据库的方法是使用联接(Join)……然而,如果正在使用联接操作,记住数据库必须优化到在一次查询中处理3~4个联接。一旦超出这个范围,将会带来性能损失……对于每个我用过的经验法则,我都听说过令人惊讶的异常情况,所以要用些额外的时间进行性能剖析和调整",直接支撑本卡结构图。 - 原始内容:不过,通过一次查询得到一些冗余的行要比进行50次独立的查询好……然而,如果正在使用联接操作,记住数据库必须优化到在一次查询中处理3~4个联接。一旦超出这个范围,将会带来性能损失。