在MySQL中获取所有内容或GROUP BY?

时间:2012-01-24 22:46:59

标签: php mysql arrays concat

首先,这是我将要讨论的问题:

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中使用数组处理它会更好吗?

由于

5 个答案:

答案 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_idtrips的索引。 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

我还没有对它进行过测试,如果它没有用,那么请告诉我你有什么样的错误