首页 > 解决方案 > 如何提高 SQL 数据库的多重 JOIN 性能

问题描述

假设我有一个喜欢 Spotify 的应用程序,并且架构如下:

在此处输入图像描述

用户登录后,点击我的歌曲按钮,查询需要返回该用户购买的所有歌曲。

根据上面的架构,我需要编写如下 SQL:

select s.name, al.name, ar.name, g.genres
from users u 
join purchases p on u.id = p.userid
join purchaseitem pi on p.id= pi.purchaseid
join songs s on pi.itemid = s.id
join albums al on al.id = s.albumid
join genres g on g.id = s.genreid
join artists ar on ar.id = al.artisted

这种丑陋的多连接查询可能会导致严重的性能问题。

  1. 我们可以对查询本身做哪些增强?

  2. 如果我们对 SQL 查询无能为力,如何重新设计数据库模式以增强这种能力?

  3. 如果我们能够对SQL数据库进行分区,即索引,是否有助于提高性能?

  4. 如果性能是唯一的考虑因素,那么像 Cassandra 或 MongoDB 这样的 NoSQL 数据库会是更好的选择吗?

标签: sql-servermongodbjoincassandra

解决方案


您可以对购买项目表进行非规范化,并将所有其他数据(专辑名称、艺术家姓名等)保留在购买项目表中。一旦购买完成,数据将不会改变。

例如,如果您在购买后更改艺术家姓名怎么办。然后稍后您的报告将有一个新的艺术家姓名,但在购买时该艺术家的姓名不存在。

您不需要在系统中保留购买历史记录。?

然后你可以简化这个采石场,但你必须考虑你的整体设计,这可能是你解决方案中的一个采石场。当你冗余数据时,你必须确保你在系统中有正确的控制。规范化关系数据库中的所有数据没有硬性规定。

您可以通过非规范化表来提高读取性能,但它会影响插入和更新。您需要平衡这些与您的要求

选择 NOSQL 不会是灵丹妙药。您可以通过适当的设计在关系数据库系统中处理数百万条记录。此外,微服务模式可用于可扩展性,但它会使您的设计和技术堆栈复杂化。


推荐阅读