在django項目中一般都是使用ORM來操作sql語句,但是這帶來了一個問題,例如:我在站點地圖的代碼中有這樣一句: def items(self): return NBA.objects.values('id').filter(display=1).order_by('id' 這個轉化成sql語句大概是這樣子:
本地測試一直都沒問題,但是上傳到服務器上結果發(fā)現了問題,輸出的語句不知道為什么一直沒用到聯合索引idx_id_display,而使用聯合索引的語句速度比未使用的情況下快30倍,實測USE INDEX (idx_id_display) SELECT `nba`.`id` FROM `nba` USE INDEX (idx_id_display) WHERE `nba`.`display` = 1 ORDER BY `nba`.`id` ASC LIMIT 3441 OFFSET 535000 這就帶來了一個問題,如何在django的ORM中使用原生的sql語句, 原本的代碼:
修改的代碼如下: from django.db import connection
class DetailSitemap(LimitSitemap): changefreq = 'weekly' priority = 0.6 def items(self): query = 'SELECT `nba`.`id` FROM `nba` USE INDEX (idx_id_display) WHERE `nba`.`display` = 1 ORDER BY `nba`.`id`' with connection.cursor() as cursor: cursor.execute(query) result = cursor.fetchall() return result
def location(self, obj): return reverse('detail', args=[obj[0]])
def lastmod(self, obj): return datetime.now() 這里面其實還有一個問題,就是修改后的代碼在數據庫文件中其實少了ASC LIMIT 5000 OFFSET 1540000這種偏移量,但是我在實際測試站點地圖頁面的時候發(fā)現確實二者的返回頁面結果都是一樣的,那就不糾結了。 |
|