[英]Optimize very slow Mysql Query
我需要幫助優化此查詢:
SELECT
c.rut, c.nombre, c.apellido, c.estado, c.porcentajeavance,
c.porcentajenota, c.nota, c.curso, c.fecha_inicio,
c.fecha_termino, c.grupo, c.fecha, c.cargo
FROM tbl_historico c
WHERE fecha = (
SELECT max( t.fecha ) fecha
FROM tbl_historico t
WHERE t.rut = c.rut AND c.curso = t.curso
)
解釋輸出:
+----+--------------------+-------+------+-----------------+-------+---------+-----------------------------------------+--------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+--------------------+-------+------+-----------------+-------+---------+-----------------------------------------+--------+-------------+
| 1 | PRIMARY | c | ALL | NULL | NULL | NULL | NULL | 158008 | Using where |
| 2 | DEPENDENT SUBQUERY | t | ref | rut,rut_2,rut_3 | rut_3 | 514 | campus_mdle1.c.rut,campus_mdle1.c.curso | 27 | Using index |
+----+--------------------+-------+------+-----------------+-------+---------+-----------------------------------------+--------+-------------+
我認為你可以重寫它以避免相關的子查詢:
SELECT c.rut, c.nombre, c.apellido, c.estado, c.porcentajeavance
, c.porcentajenota, c.nota, c.curso, c.fecha_inicio
, c.fecha_termino, c.grupo, c.fecha, c.cargo
FROM
tbl_historico AS c
JOIN
( SELECT rut, curso, MAX(fetcha) AS fetcha
FROM tbl_historico
GROUP BY rut, curso
) AS grp
ON (grp.rut, grp.curso, grp.fetcha)
= ( c.rut, c.curso, c.fetcha)
(rut, curso, fetcha)
上的索引對此查詢很有用。
另一種解決方案是:
SELECT c.rut, c.nombre, c.apellido, c.estado, c.porcentajeavance
, c.porcentajenota, c.nota, c.curso, c.fecha_inicio
, c.fecha_termino, c.grupo, c.fecha, c.cargo
FROM
( SELECT rut, curso
FROM tbl_historico
GROUP BY rut, curso
ORDER BY rut, curso --- custom order and
LIMIT 30 OFFSET 0 --- limit here
) AS dc
JOIN
tbl_historico AS c
ON c.PK = --- the Primary Key of the table here
( SELECT h.PK --- and here
FROM tbl_historico AS h
WHERE (h.rut, h.curso) = (dc.rut, dc.curso)
ORDER BY h.fetcha DESC
LIMIT 1
)
這將顯示不同的結果(在綁定的情況下,將僅顯示其中一個綁定的行)但如果要限制行數,則可能更快。
SELECT c.rut, c.nombre, c.apellido,c.estado, c.porcentajeavance,
c.porcentajenota, c.nota, c.curso, c.fecha_inicio, c.fecha_termino,c.grupo,c.fecha,c.cargo
FROM tbl_historico c
ORDER BY c.fecha DESC
LIMIT 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.