Mysql子查询在视图中很慢

时间:2015-06-26 11:10:25

标签: mysql sql view query-optimization

我正在尝试使用data_coleta(DATE)和servico_id作为基础从表中获取最后结果。查询正在运行,但速度很慢。我该如何优化?

select t1.* from
amostra_ensaio_full t1
where
t1.cliente_id = 6 and t1.tipo_id <> 1
and t1.data_coleta = (SELECT max(s1.data_coleta) from amostra_ensaio_full s1 where t1.cliente_id = s1.cliente_id and s1.tipo_id <> 1 and s1.tipo_id = t1.tipo_id)
and t1.servico_id = (SELECT max(s2.servico_id) from amostra_ensaio_full s2 where t1.cliente_id = s2.cliente_id and s2.tipo_id <> 1 and s2.tipo_id = t1.tipo_id)
GROUP by t1.cliente_id , t1.tipo_id

2 个答案:

答案 0 :(得分:0)

您可以使用索引来加速此查询。

查询是:

select t1.*
from amostra_ensaio_full t1
where t1.cliente_id = 6 and t1.tipo_id <> 1 and
      t1.data_coleta = (SELECT max(s1.data_coleta)
                        from amostra_ensaio_full s1
                        where t1.cliente_id = s1.cliente_id and 
                              s1.tipo_id <> 1 and
                              s1.tipo_id = t1.tipo_id
                       ) and
     t1.servico_id = (SELECT max(s2.servico_id)
                      from amostra_ensaio_full s2
                      where t1.cliente_id = s2.cliente_id and
                            s2.tipo_id <> 1 and
                            s2.tipo_id = t1.tipo_id
                     )
GROUP by t1.cliente_id , t1.tipo_id;

您需要查询的以下索引:amostra_ensaio_full(cliente_id, tipo_id, servico_id)

子查询中不需要条件tipo_id <> 1,但它不会造成任何伤害。

答案 1 :(得分:0)

Tks Gordon,但查询仍然缓慢。也许我找到了更多的答案。

SELECT  a.*
FROM amostra_ensaio_full a 
    INNER JOIN
    (
        SELECT MAX(data_coleta) maxDate , tipo_id, cliente_id 
        FROM amostra_ensaio_full
        GROUP BY cliente_id, tipo_id
    ) b ON a.cliente_id = b.cliente_id and a.tipo_id = b.tipo_id and     b.maxDate = a.data_coleta
GROUP by a.cliente_id ,a.tipo_id