为啥在大型数据库上查找具有特定 ID 的对象的 Django 查询比在较小数据库上要慢?

Posted

技术标签:

【中文标题】为啥在大型数据库上查找具有特定 ID 的对象的 Django 查询比在较小数据库上要慢?【英文标题】:Why does a Django query that looks for an object with a specific id is slower on a large DB than on a smaller one?为什么在大型数据库上查找具有特定 ID 的对象的 Django 查询比在较小数据库上要慢? 【发布时间】:2018-10-05 15:07:09 【问题描述】:

为什么会有这样的查询:

MyModel.objects.get(id=1)

在非常大的 DB 表上比在小型 DB 表上运行更慢,甚至是一点点? (例如 10 行表与 100 万行表)

明显与 SQL 相关还是由处理查询的软件(在本例中为 Django)引起的?

【问题讨论】:

【参考方案1】:

Django 不“处理查询”。它实际上运行必要的 SQL 命令来搜索给定的对象。

明显与 SQL 相关还是由处理查询的软件(在本例中为 Django)引起的?

嗯,事情没那么简单。对于大型数据库,很多事情开始考虑。例如,您的硬件有多好。你的磁盘和 CPU 的速度有多快,RAM 有多少等。

这就是为什么当您的数据库增长并开始看到性能下降时,您需要在 RAM 中缓存数据库,或者至少是经常访问的对象。如果 RAM 太贵或无法升级,还有另一种称为 Sharding 的技术,它基本上是将数据库分散在多个服务器中。

我确信进行 google 搜索会产生大量关于优化数据库性能的详细文章。

【讨论】:

谢谢!此外,根据我过去几天的发现,索引在查询执行的速度方面起着重要作用。首先引发我的问题的是我的错误假设,即每个数据库中的每个 .get(id=x) 操作都是 O(1),无论它们的大小如何。

以上是关于为啥在大型数据库上查找具有特定 ID 的对象的 Django 查询比在较小数据库上要慢?的主要内容,如果未能解决你的问题,请参考以下文章

如何查找 jQuery 中是不是存在具有特定 id 的 div?

在具有ID的Firestore中查找特定字段

MongoDB $查找具有不同值的对象数组

如何查找具有特定字母但具有相同 ID 的最新 2 个结果

查找具有特定角色的用户

如何在对象数组中查找具有特定名称的值