gpt4 book ai didi

mysql - 如何通过限制/偏移选择来优化 select_lated?

转载 作者:行者123 更新时间:2023-11-29 14:36:02 27 4
gpt4 key购买 nike

示例:

# consider the following query run in a loop
q = Users.objects.all().select_related('profile', 'address')[start:start+batchsize]

# assume start == 1,000,000 and batchsize == 1000
print q.query

SELECT ... LEFT OUTER JOIN profile ... LIMIT 1000 OFFSET 1000000;

问题:

在这里使用 select_lated 可以加快我的查询速度,因为否则,当我稍后在循环中访问它们时,django 将进行额外的数据库调用来获取配置文件/地址(以及许多其他表)。然而,虽然这加快了迭代的开始速度,但当 OFFSET 很大时,它实际上会减慢速度。

1) 还有其他人遇到过这个问题吗?2)django中有没有解决这个问题的方法?

我有点怀疑这是 MySQL 查询引擎的问题,但只是想知道我是否可以构建我的 django 代码来帮助 MySQL 中的查询优化器。

谢谢

最佳答案

这里没有什么真正可以“解决方法”的。这是预期的行为。 select_lated 为您提供的每个外键执行 SQL JOIN。对于数据库来说,这本质上是一个更复杂的处理查询。表中的行越多,花费的时间就越长。

实际上,在这种情况下您所能做的就是对表进行尽可能多的优化。如果 profile_idaddress_id 列尚未建立索引,您应该为它们添加索引(但我怀疑 Django 已经为您完成了这项工作。

如果您不需要所有字段,您可以尝试使用 .values().values_list()< 发送更有限的查询(需要更少的网络工作来处理)/。您甚至可以在其中指定个人资料地址上的字段。

但是,如果这些字段已建立索引,并且您需要所有数据,则您要么必须解决速度缓慢的问题,要么对数据库采取一些更严厉的措施。您可以将其隔离到自己的服务器(如果还没有),如果服务器动力不足,则为服务器提供更多资源(RAM、核心等),创建一个集群来分配负载等。

关于mysql - 如何通过限制/偏移选择来优化 select_lated?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9022958/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com