首先,这是我将要讨论的问题:
SELECT route_id, direction_id
FROM stop_times
LEFT JOIN trips USING (trip_id)
WHERE stop_id= 1002
GROUP BY CONCAT(route_id, direction_id)
预期结果的示例:
route_id | direction_id
-----------------------------
106 | 0
106 | 1
13 | 0
13 | 1
21 | 0
4 | 0
4 | 1
6 | 0
因此,运行此查询将需要0.088秒的平均值。这没关系...但如果我删除GROUP BY则需要0.0026秒。
现在我的问题是:
做GROUP BY并处理MySQL中的所有内容或获取所有内容并在PHP中使用数组处理它会更好吗?
由于
答案 0 :(得分:2)
GROUP BY
之类的东西是数据库的设计目标。小于百分之一秒的差异不应该被关注。在您确实遇到真正的性能问题之前,无需开始优化。
答案 1 :(得分:2)
你可以替换它:
GROUP BY CONCAT(route_id, direction_id)
由此:
GROUP BY route_id, direction_id
您将在更短的时间内获得相同的结果。
答案 2 :(得分:0)
因为查询在没有GROUP BY
的情况下很快而且在添加时查询速度很慢,所以在我看来索引不用于分组。事实上,似乎没有涵盖route_id, direction_id
中trips
的索引。 trips
中唯一的索引以trip_id
开头,不能用于此GROUP BY
。
我建议在route_id, direction_id
的{{1}}添加索引。请注意,列应与trips
语句中使用的顺序相同。
答案 3 :(得分:0)
您应该在列stop_times.stop_id
上添加索引。
您还应该考虑在GROUP BY子句中删除CONCAT。我猜你错了。
我也想知道在这里使用GROUP BY。如果您使用它来删除重复项,那么您应该使用DISTINCT。如果您使用它来订购结果,请使用ORDER BY。
如果您仍有问题,请提供EXPLAIN的结果。
答案 4 :(得分:0)
试试这个:
SELECT concat_route_direction
FROM
(SELECT CONCAT(route_id, direction_id) AS concat_route_direction
FROM stop_times
LEFT JOIN trips USING (trip_id)
WHERE stop_id= 1002) AS concat_route_direction
GROUP_BY concat_route_direction
我还没有对它进行过测试,如果它没有用,那么请告诉我你有什么样的错误