/ / Jak uniknąć skanowania tabeli za pomocą will_paginate? - sql, ruby-on-rail, sqlite, will-paginate

Jak uniknąć skanowania tabeli przy pomocy funkcji will_paginate? - sql, ruby-on-rails, sqlite, will-paginate

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 № 1

The 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.