2016-10-10 76 views
1

當我到達的對象,我怎麼能優先考慮字段的順序在過濾器

objs = Page.objects.get(slug="some-slug.html", web_id=1) 

生成的SQL查詢

select * from cms_page WHERE ("cms_page"."web_id" = '1' AND "cms_page"."slug" = '''some-slug''') 

我想更改SQL,以

select * from cms_page WHERE ("cms_page"."slug" = '''some-slug''' and "cms_page"."web_id" = '1') 

第一個slu field字段,因爲slug字段是一個索引(Exist index with this field)

class Page(models.Model): 
    title = models.CharField(max_length=128) 
    body = models.TextField(blank=True) 
    slug = models.CharField(max_length=200, db_index=True) 
    web = models.ForeignKey(Web, editable=False) 
    def __unicode__(self): 
     return self.title 
    def save(self, *args, **kwargs): 
     if not self.slug: 
      self.slug = "{0}{1}".format(slugify(self.title),".html") 
     super(Page,self).save(*args,**kwargs) 
    class Meta: 
     unique_together = ("web", "slug") 
     index_together = ["web", "slug"] 
+0

數據庫優化器無關緊要。 – Todor

+0

爲什麼不,slug字段是一個索引 – erajuan

回答

1

對於大多數數據庫,此查詢是完全一樣

select * from cms_page WHERE ("cms_page"."web_id" = '1' AND "cms_page"."slug" = '''some-slug''') 

這一個

select * from cms_page WHERE ("cms_page"."slug" = '''some-slug''' and "cms_page"."web_id" = '1') 

你也許會重寫查詢,以使算術 操作變得更快,同時犧牲可讀性。因爲MySQL會自動執行類似的優化,所以您通常可以避免這項工作,並且使查詢更易於理解和維護。 一些由MySQL執行的優化遵循:

http://dev.mysql.com/doc/refman/5.7/en/where-optimizations.html

現在,MySQL的是沒有這麼熱有關使用索引爲PostgreSQL是,所以如果MySQL做,PostgreSQL裏面呢!

如果索引可用,那麼RDBMS查詢解析器將決定首先對由索引覆蓋的那些列執行比較。