午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

Django項目中ORM使用指定的sql語句提速30倍(強制索引)

 只怕想不到 2024-04-12 發(fā)布于湖北

    在django項目中一般都是使用ORM來操作sql語句,但是這帶來了一個問題,例如:我在站點地圖的代碼中有這樣一句:

def items(self):  return NBA.objects.values('id').filter(display=1).order_by('id'

    這個轉化成sql語句大概是這樣子:

SELECT `nba`.`id` FROM `nba` WHERE `nba`.`display` = 1 ORDER BY `nba`.`id` ASC LIMIT 3441 OFFSET 535000

本地測試一直都沒問題,但是上傳到服務器上結果發(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語句,

原本的代碼:

class DetailSitemap(LimitSitemap):    changefreq = 'weekly'    priority = 0.6    def items(self):        return NBA.objects.values('id').filter(display=1).order_by('id')
def location(self, obj): return reverse('detail',args=[obj.get('id')]) def lastmod(self, obj): return datetime.now()

修改的代碼如下:

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ā)現確實二者的返回頁面結果都是一樣的,那就不糾結了。

    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發(fā)現有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多