mysql - 如何优化 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 |
+----+-------------+--------------------+------------+--------+--------------------------+-----------+---------+-------------------------------+--------+----------+----------------------------------------------+
解决方案
graduatorie: INDEX(eliminato, baseVasca)
manifestazionigrad: INDEX(aa, codMan)
这些可能还不够。请限定查询中的每一列,以便我们知道它们来自哪个表。
但真正的问题可能是“爆炸-内爆”。首先它爆炸了JOINing
,然后它内爆了GROUP BY
。
MIN(tempoRisultato)
没有任何东西可以计算JOINs
吗?(我什至不知道涉及哪张桌子。)如果是这样,请提供,然后我们可以讨论下一步该做什么。可能有两种选择:带有 的派生表,或中可能相关或不相关MIN
的子查询。JOIN
(tempoRisultato
似乎在两张桌子上!)
推荐阅读
- python - 在 Python 中的 for 循环中断言
- javascript - 动态交换 IMG-SRC 与另一个图像?
- apache-flink - 如何按名称删除所有键的状态
- javascript - 如何更改字体图标一部分的颜色?
- javascript - 图库页面使用了哪个库/模块
- excel - 为将多行组合在一起的下拉列表创建过滤器
- azure - 错误:使用 Next.js 应用程序部署到 Azure 时出现“需要域选项”
- assembly - bochs hlp 中的 FASM 引导加载程序
- systemd - 如何使用 systemd 服务文件删除目录的内容?
- typescript - 用有效负载错误反应本机'NAVIGATE'