Używam Django/apache/sqlite3 i mam model Django, który wygląda tak:Poprawa wydajności Django DB zapytania
class Temp_entry(models.Model):
dateTime = models.IntegerField() #datetime
sensor = models.IntegerField() # id of sensor
temp = models.IntegerField() # temp as temp in Kelvin * 100
Próbuję dostać ostatnich 300 Temp_entry przedmiotów do umieszczenia w wykres. Robię to w ten sposób:
revOutsideTempHistory = Temp_entry.objects.filter(sensor=49).order_by('dateTime').reverse()[:300]
Jednak zapytanie to trwa ~ 1 sekundę. Czy istnieje sposób, aby to poprawić? Wykopałem i okazało się, że order_by jest okropnie nieefektywne, więc mam nadzieję, że istnieje realna alternatywa?
Alternatywą, o której myślałem, ale nie potrafię wymyślić, jak ją wdrożyć, byłoby uruchamianie zapytania co 20 minut i przechowywanie go w pamięci podręcznej, co byłoby również do zaakceptowania, ponieważ dane mogą być nieco nieaktualne bez żadnych problemów ruchomości.
Dzięki Alexey, dwa pytania uzupełniające: czy istnieje sposób na uruchamianie zapytania co 20 minut zamiast oczekiwania na żądanie sprawdzenia, czy jest nieaktualny? Co robi db_indeksy? – Andy
Andy, db_index tworzy zwykły indeks bazy danych, który zwiększy prędkość zapytania. Jednak to przyspieszenie jest niczym w porównaniu z buforowaniem. Zauważ również, że takie bazy danych, jak MySQL i Postgre, mają wewnętrzne buforowanie zapytań, ale nie masz pewności co do sqlite. Zgodnie z pierwszym pytaniem: tak, możesz użyć polecenia django i czegoś takiego jak cron lub seler, ale myślę, że to nie jest dobre rozwiązanie –
Dzięki Alexey, używanie indeksów i buforowanie widoku renderuje się w akceptowalnym czasie – Andy