我需要帮助优化此查询:
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
)
EXPLAIN输出:
+----+--------------------+-------+------+-----------------+-------+---------+-----------------------------------------+--------+-------------+
| 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 |
+----+--------------------+-------+------+-----------------+-------+---------+-----------------------------------------+--------+-------------+
答案 0 :(得分:2)
我认为你可以重写它以避免相关的子查询:
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
)
这将显示不同的结果(如果是关系,将只显示其中一个绑定的行),但如果您想限制行数,它可能会更快。
答案 1 :(得分: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