Sekedar catatan singkat karena hal semacam ini terlihat berulang kali:GABUNG di prism_worlds
tidak diperlukan karena Anda (kemungkinan besar) tidak memerlukan data dari tabel itu. Anda pada dasarnya meminta database "beri saya setiap nama dunia yang namanya sama dengan 'sesuatu'". Gunakan subkueri skalar sebagai gantinya.
Buat indeks unik di prism_worlds.world
dan jalankan kueri seperti
SELECT *
FROM prism_data
WHERE prism_data.world_id = (SELECT w.world_id FROM prism_worlds AS w WHERE w.world = 'DeuxTiersMondes')
LIMIT 1000;
Pengoptimal akan mengetahui bahwa prism_data.world_id
dibatasi pada nilai konstan tunggal. MySQL akan menjalankan kueri sebelumnya untuk mengetahui nilai ini dan menggunakannya di sepanjang kueri. Lihat EXPLAIN
untuk const
-subquery dieksekusi.
Mengenai prism_data.x
, .y
dan .z
:Anda mungkin ingin membuat kolom geometri dan indeks spasial untuk itu. Jika Anda perlu tetap berpegang pada nilai yang terpisah, Anda mungkin ingin memisahkan seluruh geometri dunia menjadi voxel dengan ukuran tetap (diwakili oleh satu int) dan menggunakan geometri sederhana untuk mengetahui posisi mana yang termasuk dalam voxel.
Solusi pribadi saya adalah tidak memberikan terlalu banyak pemikiran untuk menambahkan trilyunan pertanyaan di tabel ini. Indeks akan membuatnya lambat dan besar. Gunakan tugas cron untuk mengisi tabel pelaporan (tampilan terwujud) untuk menghasilkan hasil sebelumnya dan gunakan selama tugas cron muncul dan memperbaruinya lagi.