Mam oświadczenie SELECT
, które chciałbym zoptymalizować. mysql - order by optimization mówi, że w niektórych przypadkach indeks nie może być użyty do optymalizacji ORDER BY
. Konkretnie chodzi:Czy optymalizacja ORDER BY zaczyna obowiązywać w następującej instrukcji SELECT?
użyć ORDER BY na niesąsiadujące częściach kluczowy
SELECT * FROM t1 WHERE klucz2 = stała ORDER BY key_part2;
daje mi do myślenia, że tak może być. Używam następujące indeksy:
UNIQUE KEY `met_value_index1` (`RTU_NB`,`DATETIME`,`MP_NB`),
KEY `met_value_index` (`DATETIME`,`RTU_NB`)
Z poniższego instrukcja_sql:
SELECT * FROM met_value
WHERE rtu_nb=constant
AND mp_nb=constant
AND datetime BETWEEN constant AND constant
ORDER BY mp_nb, datetime
- byłoby wystarczająco usunąć indeks
met_value_index1
i utworzyć go z nowym zamówieniuRTU_NB
,MP_NB
,DATETIME
? - Czy muszę dołączyć RTU_NB do klauzuli
ORDER BY
?
Rezultat: Próbowałem co @meriton zaproponował i dodał indeksu
met_value_index2
. The
SELECT
ukończył po 1,2 sekundy, poprzednio zakończył po 5,06 sekundy. Następujące kwestie nie należą do pytania, ale jako informacja dodatkowa: po kilku innych próbach przełączyłem silnik z MyISAM na InnoDB - z
rtu_nb, mp_nb, datetime
jako kluczem podstawowym - a instrukcja zakończona po 0,13 sekundy!
Dziękuję za wyjaśnienie i sugestię. Wypróbuję to i jak najszybciej zdam sprawozdanie z wyników - obecnie zdalna maszyna jest wyłączona - i jestem ciekawa, co się zmieni. –