Tylko krótka uwaga, ponieważ tego rodzaju rzeczy są widywane w kółko:JOIN na prism_worlds
jest niepotrzebne, ponieważ (najprawdopodobniej) nie potrzebujesz danych z tej tabeli. Zasadniczo pytasz bazę danych "podaj mi każdą nazwę światów, dla których nazwa jest równa 'coś'". Zamiast tego użyj podzapytania skalarnego.
Utwórz unikalny indeks na prism_worlds.world
i uruchom zapytanie, takie jak
SELECT *
FROM prism_data
WHERE prism_data.world_id = (SELECT w.world_id FROM prism_worlds AS w WHERE w.world = 'DeuxTiersMondes')
LIMIT 1000;
Optymalizator zorientuje się, że prism_data.world_id
jest ograniczony do jednej stałej wartości. MySQL uruchomi zapytanie z wyprzedzeniem, aby określić tę wartość i użyć jej w całym zapytaniu. Zobacz EXPLAIN
dla const
-wykonano podzapytanie.
Odnośnie do prism_data.x
, .y
i .z
:Możesz chcieć utworzyć kolumnę geometrii i indeks przestrzenny do tego. Jeśli musisz trzymać się oddzielnych wartości, możesz chcieć podzielić całą geometrię świata na woksele o stałym rozmiarze (reprezentowane przez pojedynczy int) i użyć prostej geometrii, aby dowiedzieć się, która pozycja przypada na który woksel.
Moim osobistym rozwiązaniem byłoby nie zastanawianie się nad dodawaniem dziesiątek milionów zapytań do tego stołu. Indeksy spowodują, że będzie powolny i duży. Użyj zadania crona, aby wypełnić tabelę raportowania (widok zmaterializowany), aby wygenerować wyniki z wyprzedzeniem i używaj ich, dopóki zadanie crona pojawi się i zaktualizuje je ponownie.