Używam will_paginate, aby uzyskać górne 10-20 wierszy z tabeli, ale odkryłem, że proste zapytanie, które generuje, to skanowanie całej tabeli.
sqlite> explain query plan
SELECT "deals".* FROM "deals" ORDER BY created_at DESC LIMIT 10 OFFSET 0;
0|0|0|SCAN TABLE deals (~1000000 rows)
0|0|0|USE TEMP B-TREE FOR ORDER BY
Jeśli korzystałem z klauzuli WITH i indeksów, to jestemna pewno będzie inaczej, ale to tylko wyświetlanie najnowszych postów na górnej stronie witryny. Znalazłem tutaj post lub dwa, które sugerowałyby dodanie indeksów, ale nie widzę, jak to może pomóc w skanowaniu tabeli.
sqlite> explain query plan
SELECT deals.id FROM deals ORDER BY id DESC LIMIT 10 OFFSET 0;
0|0|0|SCAN TABLE deals USING INTEGER PRIMARY KEY (~1000000 rows)
Wydaje się, że jest to powszechny przypadek użycia, więc jak zwykle wykonuje się to skutecznie?
Odpowiedzi:
0 dla odpowiedzi № 1The ORDER BY created_at DESC
wymaga, aby baza danych szukała największych wartości w całej tabeli.
Aby przyspieszyć wyszukiwanie, potrzebujesz indeksu na created_at
kolumna.