我有一些与数据库性能相关的问题。我在我的应用程序中有以下Django模型及其相应的管理类。该数据库是MySQL,它托管在Amazon RDS上。
MODEL
class Notification(models.Model):
id = models.AutoField(primary_key=True)
token = models.ForeignKey(Token, blank=False, null=False)
alert = models.ForeignKey(Alert, blank=False, null=False)
created_at = models.DateTimeField(auto_now=True)
is_sent = models.BooleanField(default=False)
is_processed = models.BooleanField(default=False)
error_sending = models.BooleanField(default=False)
# ...
def __unicode__(self):
return u'%s' % (self.alert )
管理
class AppNotification(admin.ModelAdmin):
fields = ['token','alert','is_sent','is_processed','error_sending']
#
list_display = ('token','alert','created_at','is_sent','is_processed','error_sending')
#
search_fields = ('app__app_name','token__token')
#
list_select_related = True
#
list_per_page = 25
admin.site.register(Notification,AppNotification)
答案 0 :(得分:4)
关于你的第二个问题:
此表的django管理界面太慢了。它需要四处走动 在没有dB负载的情况下加载30秒。通常需要2个以上 数据库执行任何作业时加载的分钟数。
这似乎是一个缓慢的查询?一个好的起点是查看正在运行的查询(django调试工具栏)并使用db提供的工具explain
来调试它们并添加适当的索引
bulk_create
方法中添加了,这至少可以减少通过网络为插入数据传输数据的时间吗?
答案 1 :(得分:4)
花了20多分钟才增加约45000条记录 通知表,通过for循环。这个时间是慢还是正常?
这种设置并不罕见。 Django ORM并不快,如果速度很重要,它不是添加数千个条目的好方法。 RDS的速度取决于实例类型,但通常低端的速度也不快。
替代方案是使用低级SQL或使用bulk_create
,但是您必须记住,这些方法都不会调用对象.save()
,也不会发送pre_save
和{{ 1}}信号。在这些包含大量业务逻辑的情况下,这可能是一个问题。
此表的django管理界面太慢了。它需要四处走动 在没有dB负载的情况下加载30秒。通常需要2个以上 数据库执行任何作业时加载的分钟数。这张桌子 通常每周或每两周增加一百万条记录。有办法吗? 提高数据库和/或系统的性能,或者是这样 当前的加载时间是否正常?
你的模特管理员中有post_save
,这似乎是唯一可以让它变慢的东西。它确实加入了list_select_related = True
和Tokens
。
答案 2 :(得分:0)
我最近遇到了完全相同的问题,不得不深入挖掘找到解决办法让我的Django管理员为100M +记录的表格哼唱。我的问题最后是在页面加载时查询费用COUNT(*)
,而且每当我使用search_fields
中的ModelAdmin
之一时,搜索查询的结构都很差。
经过大量研究和思考后,我提出了一些不错的解决方案,并在此处记录:http://craiglabenz.me/2013/06/12/how-i-made-django-admin-scale/