Maks groupwise tidak dijamin berfungsi. Faktanya, MariaDB memecahkannya, tetapi menyediakan pengaturan untuk mendapatkannya kembali. Ini yang saya maksud:
SELECT *
FROM
( SELECT ... ORDER BY ... )
GROUP BY ...
di mana Anda ingin yang pertama (atau terakhir) di setiap grup dari kueri dalam. Masalahnya adalah SQL bebas untuk mengoptimalkan maksud itu.
Kode maks groupwise dalam dokumen sangat tidak efisien.
Untuk mempercepat kueri, kemungkinan sedikit bantuan adalah mengisolasi Rules
atau Places
bagian dari klausa WHERE dan membuatnya menjadi subquery yang mengembalikan hanya PRIMARY KEY dari tabel yang sesuai. Kemudian masukkan itu ke GABUNG dengan semua tabel (termasuk GABUNG kembali ke tabel yang sama). Anda sudah memiliki "covering index" untuk subquery tersebut sehingga bisa menjadi "Using index" (dalam jargon yang digunakan oleh EXPLAIN).
Apakah innodb_buffer_pool_size disetel ke sekitar 70% dari RAM yang tersedia?
BIGINT membutuhkan 8 byte; Anda mungkin bisa hidup dengan MEDIUMINT UNSIGNED (0..16M). Lebih kecil --> lebih dapat disimpan dalam cache --> lebih sedikit I/O --> lebih cepat.
Sepasang DOUBLE untuk lat/lng membutuhkan 16 byte. Sepasang FLOAT akan membutuhkan 8 byte dan memiliki resolusi 6 kaki / 2m. Atau DECIMAL(6,4) untuk garis lintang dan (7,4) untuk garis bujur untuk 7 byte dan resolusi 52 kaki / 16m. Cukup baik untuk "toko", terutama karena Anda menggunakan 'persegi' bukan 'lingkaran' untuk jarak.
Kode untuk "temukan yang terdekat ..." sulit untuk dioptimalkan. Inilah yang terbaik yang saya buat:http://mysql.rjweb.org/doc .php/latlng