首页 > 解决方案 > 如何优化 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           |
+----+-------------+--------------------+------------+--------+--------------------------+-----------+---------+-------------------------------+--------+----------+----------------------------------------------+

标签: mysqlsqlperformancemysql-slow-query-log

解决方案


graduatorie:  INDEX(eliminato, baseVasca)
manifestazionigrad:  INDEX(aa, codMan)

这些可能还不够。请限定查询中的每一列,以便我们知道它们来自哪个表。

但真正的问题可能是“爆炸-内爆”。首先它爆炸了JOINing,然后它内爆了GROUP BY

MIN(tempoRisultato) 没有任何东西可以计算JOINs吗?(我什至不知道涉及哪张桌子。)如果是这样,请提供,然后我们可以讨论下一步该做什么。可能有两种选择:带有 的派生表,或中可能相关或不相关MIN的子查询。JOIN

tempoRisultato似乎在两张桌子上!)


推荐阅读