Mam stoły gracze , klany i clanmembers , co łączy graczy do klanów. Chcę zrobić, to poprosić wszystkich graczy z informacjami klanowymi niezależnie od ich posiadania klanu, czy nie i sortować ich przez graczy.rank (indeksowane).

Wybierz * od graczy w lewo dołączyć klanmembers na clanmembers.player = odtwarzacze.

Powyższe zapytanie działa poprawnie, ale z jakiegoś powodu skanuje stół całych graczy (mnóstwo wierszy), a zapytanie jest bardzo powolne. Jeśli wybieram graczy. * Zamiast tego skreockets wydajności i tylko 100 rzędów jest zbadane zamiast wszystkich graczy.

Co tu robię? Nie rozumiem, dlaczego dodawanie rzeczy klanów, aby wybrać, sprawia, że zapytań skanuje tabelę pełnoziarnistą, gdy dołączenia pozostają dokładnie takie same.

Edytuj: Wszystkie indeksy tutaj.

Edytuj 2: Wyniki zapytania (wyjaśnij) tutaj

-1
Joonas Alhonen 16 luty 2017, 14:47

2 odpowiedzi

Najlepsza odpowiedź

Wygląda na to, że dodanie Indeks Force (Rank) naprawia problem.

Stary i wolny:

SELECT * FROM players LEFT JOIN clanmembers ON clanmembers.player = players.id LEFT JOIN clans ON clanmembers.clan = clans.id ORDER BY rank DESC LIMIT 0,100;

Nowy i szybki:

SELECT * FROM players FORCE INDEX (rank) LEFT JOIN clanmembers ON clanmembers.player = players.id LEFT JOIN clans ON clanmembers.clan = clans.id ORDER BY rank DESC LIMIT 0,100
1
Joonas Alhonen 16 luty 2017, 14:04

Gdy dołączasz do tabeli player z innymi tabelami (w ten sposób filtrowanie player id) przed zamówieniem, może musisz dodać player id do indeksu. Coś takiego:

CREATE INDEX index_name ON players (rank, id);

I opcjonalnie, jeśli zawsze zamawiasz w porządku malejącym, coś takiego:

CREATE INDEX index_name ON players (rank DESC, id);
1
Javi Fernández 16 luty 2017, 13:23