为什么当一个几乎相同的查询工作正常时,这个MySQL查询从不执行?

z4bn682m  于 2023-04-19  发布在  Mysql
关注(0)|答案(1)|浏览(112)

有问题的查询:

SELECT np.name AS name_trips, 
        s.station_name AS station_name, 
        np.id AS id, 
        COUNT(*) AS num_trips, 
        COUNT(NULLIF(np.start_end, 'Start')) AS num_start, 
        COUNT(NULLIF(np.start_end, 'End')) AS num_end
    FROM name_id_pairs np
    JOIN stations s ON np.id=s.station_id
    WHERE id IN(2498,3794)
    GROUP BY name, id
    ORDER BY id, num_trips DESC;

我的另一个每次都有效的查询是

SELECT np.name AS name_trips, 
        s.station_name AS station_name, 
        np.id AS id, 
        COUNT(*) AS num_trips, 
        COUNT(NULLIF(np.start_end, 'Start')) AS num_start, 
        COUNT(NULLIF(np.start_end, 'End')) AS num_end
    FROM name_id_pairs np
    JOIN stations s ON np.id=s.station_id
    WHERE id IN(
        SELECT id
        FROM name_id_pairs 
        GROUP BY id
        HAVING COUNT(DISTINCT name)>1)
    GROUP BY name, id
    ORDER BY id, num_trips DESC;

这两个查询之间唯一的区别是WHERE子句,那么为什么带有子查询的查询总是在几秒钟内完成,而WHERE id IN(2498,3794)将继续执行,直到我重新启动服务器。
两个查询都从同一视图中进行选择

CREATE VIEW name_id_pairs AS
    SELECT checkout_station_name AS name, checkout_station_id AS id, "Start" AS start_end
    FROM trips
    UNION ALL
    SELECT return_station_name AS name, return_station_id AS id, "End" AS start_end
    FROM trips;

我意识到视图可能会对MySQL的性能造成影响,但如果两个查询都使用同一个视图,我不认为它只会影响其中一个的性能。
所有的查询都是通过Python和MySQL连接器执行的。
由于查询之间的唯一区别是where子句,所以我尝试了几个不同版本的查询,但都没有正确执行。我尝试用WHERE id = 2498 OR id = 3794替换列表,但没有任何改变。我还尝试用等效的s.station_id或www.example.com替换idnp.id,但查询仍然没有执行。

kmpatx3s

kmpatx3s1#

请用它所在的表来限定每一列。例如,id就把我搞糊涂了;它似乎在所有3个表中。但是哪个是哪个?* 也许 * 这是你问题的根源。
注意JOIN中的COUNTs--JOIN先发生。这可能导致膨胀的计数。
一般来说,IN ( SELECT ... )的效率很低。最好使用JOINEXISTS。(我很惊讶IN的速度更快。)
我对GROUP BY id的逻辑感到困惑,但正在寻找dup name。你能展示一些数据给予我感觉是怎么回事吗?
要回答您的问题,我们需要查看每个查询的EXPLAIN SELECT ...

相关问题