Mam więc tabelę ulubionych użytkowników. Jest ich kilka milionów.Wydajny sposób na przechowywanie elementów do ponownego zamówienia w bazie danych
Obecnie mają tylko trzy kolumny: id
(pk), userId
i someFkRef
. Jest indeks na userId
, który pozwala mi szybko wybrać ulubione osoby.
Obecnie są one zamawiane przez id
, co jest w rzeczywistości tylko zamówieniem wkładki. Chcielibyśmy zaoferować użytkownikowi szansę na ponowne zamówienie swoich ulubionych, najprawdopodobniej za pomocą pewnego rodzaju interakcji przeciągnij i upuść.
Moje pierwsze (i podejrzewam naiwne) podejście do tego byłoby po prostu dodanie kolumny order
i indeksu złożonego ponad userId
, order
. Jednak po odbiciu, gdy użytkownik przesunie swój przedmiot w pewnej odległości nad listą, wszystkie pośrednie wiersze między początkową pozycją przedmiotu a końcową pozycją będą musiały ponownie przeliczyć kolumnę order
, a tym samym także indeks.
Jest to (najprawdopodobniej) złe.
Zanim przejdę przez wieki próbując dokładnie określić, jak źle, zastanawiam się, czy istnieje lepsza reprezentacja oparta na tabelach, która jest tańsza w manipulowaniu przy operacjach opisanych powyżej.
Nie jestem przekonany, że musisz zindeksować nowe pole. –
Ogólnie rzecz biorąc, 'order by' ops wymaga indeksu, nie? – spender
@spender Wymagaj nie, ale jeśli twoje wiersze tabeli są duże i otrzymujesz duży zestaw wyników, sortowanie za pomocą indeksu może generować nieco mniej operacji we/wy. –