#mysql #sql #performance #mysql-slow-query-log
#mysql #sql #Производительность #mysql-журналмедленных запросов
Вопрос:
У меня проблема с запросом mysql, для выполнения которого иногда требуется более 80 секунд.
Не могли бы вы, пожалуйста, помочь мне оптимизировать его?
Вот мой sql-код
SELECT
codFinAtl,
nome,
cognome,
dataNascita AS annoNascita,
MIN(tempoRisultato) AS tempoRisultato
FROM
graduatorie
INNER JOIN anagrafica ON codFin = codFinAtl
INNER JOIN manifestazionigrad ON manifestazionigrad.codice = graduatorie.codMan
WHERE
anagrafica.eliminato = 'n'
AND graduatorie.eliminato = 'n'
AND codGara IN('01', '81')
AND sesso = 'F'
AND manifestazionigrad.aa = '2018/19'
AND graduatorie.baseVasca = '25'
AND tempoRisultato IS NOT NULL
AND dataNascita BETWEEN '20050101' AND '20061231'
GROUP BY
codFinAtl
ORDER BY
tempoRisultato,
cognome,
nome
[ОБНОВИТЬ]
Здесь приведены результаты запроса EXPLAIN
---- ------------- -------------------- ------------ -------- -------------------------- ----------- --------- ------------------------------- -------- ---------- ----------------------------------------------
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
---- ------------- -------------------- ------------ -------- -------------------------- ----------- --------- ------------------------------- -------- ---------- ----------------------------------------------
| 1 | SIMPLE | anagrafica | NULL | ALL | codFin | NULL | NULL | NULL | 334094 | 0.11 | Using where; Using temporary; Using filesort |
| 1 | SIMPLE | graduatorie | NULL | ref | codMan,codFinAtl,codGara | codFinAtl | 33 | finsicilia.anagrafica.codFin | 20 | 0.24 | Using where |
| 1 | SIMPLE | manifestazionigrad | NULL | eq_ref | codice | codice | 32 | finsicilia.graduatorie.codMan | 1 | 10.00 | Using index condition; Using where |
---- ------------- -------------------- ------------ -------- -------------------------- ----------- --------- ------------------------------- -------- ---------- ----------------------------------------------
Комментарии:
1. Кроме того, вопросы об оптимизации запроса всегда требуют ОБЪЯСНЕНИЯ для данного запроса
2. И почему ‘manifestazionigrad.codice’ получает квалификацию, и ничего больше? 🙁 ?
3. Нам нужно увидеть индексы; пожалуйста, предоставьте
SHOW CREATE TABLE
. Запрос неудобен для чтения, поскольку некоторые столбцы не соответствуют таблице, в которой они находятся. Вы слышали о «составных индексах»?4. @Strawberry Я добавил ПОЯСНЯЮЩИЕ результаты
5. Спасибо за отчет о ходе работы
Ответ №1:
graduatorie: INDEX(eliminato, baseVasca)
manifestazionigrad: INDEX(aa, codMan)
Этого может быть недостаточно. Пожалуйста, уточните каждый столбец в запросе, чтобы мы знали, из какой таблицы они взяты.
Но реальная проблема, вероятно, заключается в «взрыве-implode». Сначала он взрывается на JOINing
, затем он взрывается на GROUP BY
.
Возможно ли вычислить MIN(tempoRisultato)
без каких JOINs
-либо? (Я даже не могу сказать, какая таблица задействована.) Если да, укажите это, тогда мы сможем обсудить, что делать дальше. Может быть два варианта: производная таблица с MIN
или подзапрос в JOIN
, который может быть коррелированным или некоррелированным.
( tempoRisultato
кажется, в двух таблицах!)