django 分页查询大表,很慢
生活随笔
收集整理的這篇文章主要介紹了
django 分页查询大表,很慢
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
問題
mysql有一張20W+的表,包含創建時間字段job_create_time,有索引,主鍵job_id,同時包含另外十幾個字段。根據創建時間orderby之后,對其進行分頁查詢,當查詢最后幾頁的時候會超級慢。
性能低的django語句,耗時18s
類似下面的語句,從20W的數據中查詢靠后的幾條。此時查詢非常慢。
job_status = 'p'cur_page = int(200000/8)jobs = Job.objects.filter(job_status=job_status).order_by('-create_time')paginator = Paginator(jobs, 8)jobs_in_page = paginator.page(cur_page)res = []for j in jobs:res.append(model_to_dict(j))以上django會產生的sql類似:
select * from job where job_status='p' order by job_create_time desc offset 200000 limit 8;這個sql中的limit查詢出幾乎所有行的所有字段,然后拋棄前20W。是掃表操作。很慢。
改進后的django語句,耗時 0.5s
轉換化為兩次查詢,同時第一次查詢使用only查詢特定字段。django默認為查詢所有字段。
job_status = 'p'cur_page = int(200000/8)# 只查詢 job_id jobs_only_id = Job.objects.filter(job_status=job_status).only('job_id').order_by('-create_time') paginator = Paginator(jobs_only_id, 8)jobs_in_page = paginator.page(cur_page)# 根據job_id 使用in 查詢,查詢出所需要的job信息jobs = Job.objects.filter(job_id__in=[j.job_id for j in jobs_in_page])res = []for j in jobs:res.append(model_to_dict(j))以上django ORM 會產生兩條sql:
// 1. 首先查詢出需要的job_id select job_id from job where job_status='p' order by job_create_time desc offset 200000 limit 8; // 2。 根據job_id 查詢出所有需要的字段 select * from job where job_id in XXXXXXXXXX;第一條查詢因為走的索引,很快。第二條根據主鍵查詢,很快。
總結
以上是生活随笔為你收集整理的django 分页查询大表,很慢的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c++ 抓取桌面屏幕并转为jpg图片
- 下一篇: fp在c语言的作用,c语言中文件的读写、