Mysql 使用联接和子查询优化查询

Mysql 使用联接和子查询优化查询,mysql,subquery,query-optimization,Mysql,Subquery,Query Optimization,我想加快一个较慢的查询 问题是我无法访问子查询中的外部列值 我所拥有的: SELECT r.id AS room_id, r.room_name, coalesce(d.score,0) AS total_messages, d.latest FROM cf_rooms_time_frames tf INNER JOIN cf_rooms r on r.id = tf.room_id INNER JOIN( SELECT cf.room_id, count(*) as score,

我想加快一个较慢的查询

问题是我无法访问子查询中的外部列值

我所拥有的:

SELECT r.id AS room_id, r.room_name, coalesce(d.score,0) AS total_messages, d.latest 
FROM cf_rooms_time_frames tf
INNER JOIN cf_rooms r on r.id = tf.room_id 
INNER JOIN(
    SELECT cf.room_id, count(*) as score, max(cf.id) as latest 
    FROM cf_rooms_messages cf 
    WHERE EXISTS( 
        SELECT NULL FROM cf_rooms_time_frames tf 
        WHERE tf.start <= cf.id AND ( tf.end IS NULL OR tf.end >= cf.id ) 
        AND tf.room_id = cf.room_id AND tf.uid = 8
        )
    GROUP BY cf.room_id  
    ORDER BY latest 
    DESC ) d on d.room_id = r.id 

WHERE tf.uid = 8
ORDER BY coalesce(latest, score) DESC LIMIT 0, 20
我想要的是:

SELECT r.id AS room_id, r.room_name, coalesce(d.score,0) AS total_messages, d.latest 
FROM cf_rooms_time_frames tf
INNER JOIN cf_rooms r on r.id = tf.room_id 
INNER JOIN(
    SELECT cf.room_id, count(*) as score, max(cf.id) as latest 
    FROM cf_rooms_messages cf 
    /* line added here */
    WHERE cf.room_id = tf.room_id
    /* */
    AND EXISTS( 
        SELECT NULL FROM cf_rooms_time_frames tf 
        WHERE tf.start <= cf.id AND ( tf.end IS NULL OR tf.end >= cf.id ) 
        AND tf.room_id = cf.room_id AND tf.uid = 8
        )
    GROUP BY cf.room_id  
    ORDER BY latest 
    DESC ) d on d.room_id = r.id 

WHERE tf.uid = 8
ORDER BY coalesce(latest, score) DESC LIMIT 0, 20
我认为标记解释了查询的作用

它搜索给定用户的聊天室并按最后一条消息排序,获取id在给定时间范围内的消息总数,以及最后一条消息id

我不知道为什么,但是第一个查询返回chatmessage表cf中的所有行,如果我可以信任EXPLAIN的话。它提供了正确的结果,但是在一张巨大的桌子上速度有点慢


我用硬编码的房间id测试了第二个房间,这个房间速度很快,不会触及整个桌子。

简单使用。.从cf\u房间信息cf加入cf\u房间时间帧cf.room\u id=crtf.room\u id,或者在哪里使用会更糟吗?我记得在过去的一些事情,我做了这个没有存在的地方,但加入。解释一下缓存范围等。。这在联接中是不可能的。确定发布解释和表定义。我的错。我有一个类似的例子,范围查询需要在where exist子句中。不记得解释说了什么。但在这种情况下,连接会加快速度。但是我仍然希望将room_id放入子查询中,如上图所示。