Не е гарантирано, че ще работи макс. Всъщност MariaDB го разби, но предостави настройка, за да го върне. Ето какво имам предвид:
SELECT *
FROM
( SELECT ... ORDER BY ... )
GROUP BY ...
където искате първото (или последното) във всяка група от вътрешната заявка. Проблемът е, че SQL е свободен да оптимизира това намерение.
Груповият максимален код в документите е ужасно неефективен.
За да се ускори заявката, вероятно малко помощ е да изолирате Rules
или Places
част от клаузата WHERE и го превърнете в подзаявка, която връща само ПЪРВИЧНИЯ КЛЮЧ на съответната таблица. След това поставете това в JOIN с всички таблици (включително JOIN обратно към същата таблица). Вече имате „покриващ индекс“ за тази подзаявка, така че да може да бъде „Използване на индекс“ (на жаргона, използван от EXPLAIN).
innodb_buffer_pool_size зададен ли е на около 70% от наличната RAM памет?
BIGINT отнема 8 байта; вероятно бихте могли да живеете със MEDIUMINT UNSIGNED (0..16M). По-малък --> по-кешируем --> по-малко I/O --> по-бърз.
Двойката DOUBLE за lat/lng заема 16 байта. Една двойка FLOAT ще отнеме 8 байта и ще има разделителна способност 6 фута / 2 метра. Или DECIMAL(6,4) за географска ширина и (7,4) за дължина за 7 байта и разделителна способност 52 фута / 16m. Достатъчно добър за „магазини“, особено след като използвате „квадрат“ вместо „кръг“ за разстояние.
Кодът за "намерете най-близкия ..." е труден за оптимизиране. Ето най-доброто, което измислих:http://mysql.rjweb.org/doc .php/latlng