Django数据库优化?这是缓慢还是正常?

时间:2012-12-19 20:10:15

标签: python mysql django amazon-web-services rds

我有一些与数据库性能相关的问题。我在我的应用程序中有以下Django模型及其相应的管理类。该数据库是MySQL,它托管在Amazon RDS上。

  1. 通过for循环在Notifications表中添加 45000条记录花费超过 20分钟。这个时间是慢还是正常?
  2. 此表的django管理界面太慢了。在无dB负载下加载大约需要30秒。当数据库执行任何作业时,通常需要加载超过2分钟。该表通常每周或每两周增加一百万条记录。有没有办法提高数据库和/或系统的性能,或者当前的加载时间是否正常?
  3. 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)
    

3 个答案:

答案 0 :(得分:4)

关于你的第二个问题:

  

此表的django管理界面太慢了。它需要四处走动   在没有dB负载的情况下加载30秒。通常需要2个以上   数据库执行任何作业时加载的分钟数。

这似乎是一个缓慢的查询?一个好的起点是查看正在运行的查询(django调试工具栏)并使用db提供的工具explain来调试它们并添加适当的索引


在django 1.4 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 = TrueTokens

答案 2 :(得分:0)

我最近遇到了完全相同的问题,不得不深入挖掘找到解决办法让我的Django管理员为100M +记录的表格哼唱。我的问题最后是在页面加载时查询费用COUNT(*),而且每当我使用search_fields中的ModelAdmin之一时,搜索查询的结构都很差。

经过大量研究和思考后,我提出了一些不错的解决方案,并在此处记录:http://craiglabenz.me/2013/06/12/how-i-made-django-admin-scale/