Tôi đang sử dụng django/apache/sqlite3 và tôi có một mô hình django trông như thế này:Cải thiện hiệu suất của django DB truy vấn
class Temp_entry(models.Model):
dateTime = models.IntegerField() #datetime
sensor = models.IntegerField() # id of sensor
temp = models.IntegerField() # temp as temp in Kelvin * 100
Tôi đang cố gắng để có được 300 Temp_entry mục cuối cùng để đặt vào một đồ thị. Tôi làm như vậy:
revOutsideTempHistory = Temp_entry.objects.filter(sensor=49).order_by('dateTime').reverse()[:300]
Tuy nhiên, truy vấn này mất ~ 1 giây. đây có phải là cách cải thiện nó? Tôi đã đào xung quanh và thấy rằng order_by là khủng khiếp không hiệu quả, vì vậy tôi hy vọng rằng có một thay thế khả thi? Một thay thế tôi nghĩ, nhưng không thể tìm ra cách để thực hiện, sẽ chạy truy vấn sau mỗi 20 phút và giữ cho nó được lưu vào bộ nhớ cache, điều đó cũng có thể chấp nhận được, vì dữ liệu có thể hơi cũ và không bị bệnh hiệu ứng.
Cảm ơn Alexey, hai câu hỏi tiếp theo: có cách nào để truy vấn chạy 20 phút một lần thay vì đợi yêu cầu kiểm tra xem nó có cũ không? Db_indexes làm gì? – Andy
Andy, db_index chỉ tạo chỉ mục cơ sở dữ liệu bình thường, sẽ làm tăng tốc độ truy vấn. Tuy nhiên, tốc độ này không là gì so với bộ nhớ đệm. Cũng lưu ý rằng các DB như Mysql và Postgre có bộ nhớ đệm nội bộ của các truy vấn, nhưng không chắc chắn về sqlite. Theo câu hỏi đầu tiên: có bạn có thể sử dụng lệnh django và một cái gì đó như cron hoặc cần tây nhưng tôi nghĩ rằng đây không phải là giải pháp tốt –
Cảm ơn Alexey, bằng cách sử dụng các chỉ mục và bộ nhớ đệm xem là rendering trong một số tiền chấp nhận được thời gian – Andy