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