如何提高 SQL 数据库的多重连接性能

How To Improve Multiple JOIN Performance For SQL Database

假设我有一个类似 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. 如果性能是唯一的考虑因素,NoSQL 数据库(如 Cassandra 或 MongoDB 是更好的选择吗?

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

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

您不需要在系统中保留购买记录吗? ?

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

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

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