Само една бърза забележка, защото този вид неща се виждат отново и отново:JOIN на prism_worlds
е ненужен, защото (най-вероятно) нямате нужда от данните от тази таблица. По същество питате базата данни „дайте ми всяко име на светове, за които името е равно на „нещо““. Вместо това използвайте скаларна подзаявка.
Създайте уникален индекс на prism_worlds.world
и изпълнете заявката като
SELECT *
FROM prism_data
WHERE prism_data.world_id = (SELECT w.world_id FROM prism_worlds AS w WHERE w.world = 'DeuxTiersMondes')
LIMIT 1000;
Оптимизаторът ще разбере, че prism_data.world_id
е ограничена до една константна стойност. MySQL ще изпълни заявка предварително, за да разбере тази стойност и да я използва през цялата заявка. Вижте EXPLAIN
за const
-изпълнена подзаявка.
Относно prism_data.x
, .y
и .z
:Може да искате да създадете колона с геометрия и пространствен индекс за това. Ако трябва да се придържате към отделни стойности, може да искате да разделите цялата геометрия на света на воксели с фиксиран размер (представени от едно цяло) и да използвате проста геометрия, за да разберете коя позиция попада в кой воксел.
Моето лично решение би било да не се замислям твърде много относно добавянето на милиони заявки към тази таблица. Индексите ще го направят бавно и голямо. Използвайте задание на cron, за да попълните таблица за отчитане (материализиран изглед), за да генерирате резултатите преди време и да ги използвате, докато задачата cron се появи и ги актуализира отново.