Как оптимизировать запрос mysql

#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 кажется, в двух таблицах!)