为什么连接不好或"慢".我知道我听过不止一次.我找到了这句话

问题是连接相对来说比较复杂

source

我一直认为它们很快,尤其是在查找PK时.为什么他们"慢"?

推荐答案

可伸缩性是指预计算(缓存)、分散或将重复的工作缩减到最基本的部分,以便最大限度地减少每个工作单元的资源使用.为了更好地扩展,你不需要做任何你不需要大量做的事情,你要确保你实际做的事情尽可能高效地完成.

在这种情况下,连接两个独立的数据源当然是相对缓慢的,至少与不连接它们相比是如此,因为这是您需要在用户请求时实时完成的工作.

记住,拥有两个可供选择的数据不再是完全不同的;必须将两个不同的数据点放在同一个记录中.你不能把两个不同的数据组合在一起而不产生任何结果,所以要确保你理解这种权衡.

好消息是,现代关系数据库的连接数为good.如果数据库使用得好,就不应该认为连接速度慢.有许多可扩展性友好的方法可以获取原始连接并使其更快:

  • 使用代理键(自动编号/标识列)而不是自然键进行连接.这意味着在连接操作期间进行更小(因此更快)的比较
  • 索引
  • materialized /索引视图(将其视为预先计算的联接或managed次去规范化)
  • 计算列.您可以使用它来散列或以其他方式预计算联接的键列,这样一来,联接的复杂比较现在要小得多,而且可能是预索引的.
  • 表分区(通过将加载分散到多个磁盘,或将可能的表扫描限制为分区扫描,帮助处理大型数据集)
  • OLAP(预计算某些类型的查询/连接的结果.这不完全正确,但可以将其视为generic次非规范化)
  • 复制、可用性组、日志(log)传送或其他机制,让多台服务器回答同一数据库的读取查询,从而在多台服务器之间扩展工作负载.
  • 使用像Redis这样的缓存层来避免重新运行需要复杂连接的查询.

我甚至会说the main reason relational databases exist at all is to allow you do joins efficiently*.当然不仅仅是存储结构化数据(你可以用csv或xml这样的平面文件结构来实现).我列出的一些选项甚至可以让您提前完全构建连接,因此在发出查询之前就已经完成了结果——就像您已经对数据进行了非规范化一样(必须承认,这是以较慢的写入操作为代价的).

If you have a slow join, you're probably not using your database correctly.

只有在这些其他技术失败后,才能进行去规范化.你能真正判断"失败"的唯一方法是设定有意义的绩效目标,并对照这些目标进行衡量.If you haven't measured, it's too soon to even think about de-normalization.

也就是说,作为实体存在,不同于仅仅是表的集合.真正的rdbms的另一个原因是安全的并发访问

Sql相关问答推荐

如何在 athena 中加入 unnest 函数?

SQL Server 按从前到后的顺序从记录中减去一个值

MariaDB 中 CAST() 和 COALESCE() 的顺序很重要

使用 SQL Server 将列转换为多行

这个 Oracle SQL SELECT 不应该工作.为什么会这样?

SQL查询根据两列对日期进行排序

如何获得给定时间段的最小值

如何分组输出 2 列中的每个值组合? - SQL

在离开时计算不同的值

如何在 Sql 中聚合

如何为每组获取等于最大日期值的值的最小日期行?

什么是 DDL 和 DML?

何时可以在 SQL 表中保存 JSON 或 XML 数据

如何在带有“时间”字段的 postgresql 中按小时分组?

无法访问 Big Query 中类型为 ARRAY> 的字段

如何在一个 PostgreSQL 查询中使用多个 WITH 语句?

如何在 SQL 中获取前导 0 的月份和日期? (例如 9 => 09)

如何在 SQL Server 中以整数形式创建日期、月份和年份

如何选择每组的第一行?

如何列出 PostgreSQL 上的活动连接?