如何避免在mysql视图的子视图中进行全表扫描

时间:2019-04-10 12:53:53

标签: mysql sql subquery sql-view

此问题与MySQL有关:

我需要自行联接表以获得每个组中的最后一条记录,并将该记录与另一个表联接。

假设, comments表有4列pkidsession_idcommentcreate_datepkid是主键,并且会有很多注释每个session_id

comment_channel表具有session_idchannel(每个session_id仅一行)

现在我需要获取每个comment及其session_id中的最后一个channel

所以我可以写一个类似这样的查询:

SELECT t1.session_id, t1.comment, t3.channel, t1.create_date
FROM comments t1
    join (
        SELECT max(pkid)
        FROM comments
        GROUP BY session_id
    ) t2 on t1.pkid = t2.pkid
    left join comment_channel t3 on t1.session_id = t3.session_id

如果我想将此视图编写为视图,则不能输入相同的查询,因为MySQL不支持VIEW中的子查询。

所以我必须写两个视图:

查看1:

CREATE OR REPLACE VIEW comment_channel_view AS 
SELECT t1.session_id, t1.comment, t3.channel, t1.create_date FROM comments t1
    join comment_max_id_view t2 on t1.pkid = t2.pkid
    left join comment_channel t3 on t1.session_id = t3.session_id

查看2:

CREATE OR REPLACE VIEW comment_max_id_view AS 
SELECT max(pkid)
FROM comments
GROUP BY session_id

问题出在这里,如果我使用此视图选择特定时期

例如

SELECT * FROM comment_channel_view
WHERE create_date between '2019-04-05' and '2019-04-10'

然后comment_max_id_view进行全表扫描,而不仅仅是选定的日期范围,这需要5分钟以上的时间才能得到结果。如果我将日期范围条件放在子查询中,那么我得到的结果只是毫秒。

为避免在comment_max_id_view中进行全表扫描,我该怎么办?

0 个答案:

没有答案