4

我有一张超过 660 万行的表格。

我有一个字段,名为trip_idwho's in BINARY(16)。我发现我的查询太慢了(0.2 seconds)。此查询几乎每 3 秒运行一次。

在做任何愚蠢的事情之前,我想知道如果我将索引大小trip_id从 full 降低到 12,会有所不同吗?

如果我尝试更多地调整我的查询,会有所不同吗?

谢谢

编辑:

询问 :

SELECT      stop_times.stop_id
FROM        trips
LEFT JOIN   stop_times ON trips.trip_id = stop_times.trip_id
WHERE       trips.route_id  = '141'
GROUP BY    stop_times.stop_id
ORDER BY    trips.trip_headsign ASC,
            stop_times.stop_sequence ASC

trip_id BINARY(16)

route_id SMALLINT(3)

trip_headsign VARCHAR(50)

stop_sequence SMALLINT(3)

查询说明: 查询说明

4

3 回答 3

2

经过研究,我发现了问题,因为是的,0.2 秒很慢。

SELECT      t.trip_headsign, st.stop_sequence, s.stop_code, s.stop_name
FROM        stop_times AS st
JOIN        stops AS s USING (stop_id)
JOIN        (   SELECT  trip_id,
                        route_id,
                        trip_headsign
                FROM    trips
                WHERE   route_id = '141'
                LIMIT   2
            ) AS t
WHERE       t.trip_id = st.trip_id
GROUP BY    st.stop_id

首先,在这里更快LEFT JOIN,而不是做 a 。JOIN但重要的一点是,我匹配 WHERE 语句中的所有旅行结果。

但是,由于一辆公共汽车只能有 2 个方向,所以我只需要将结果限制为 2。现在,我的结果接近 0.018。超过 1000% 的改进。

于 2012-06-21T20:49:13.973 回答
1

您的“额外”列中有“使用临时”和“使用文件排序”。

这些是肯定的迹象,表明你可以改进事情。这些出现的原因是因为您的 GROUP 和 ORDER 子句。

第一步:它们真的有必要吗?您可能会发现,端到端地使用使用这些数据的语言对它们进行排序更便宜。

第二步:如果您仍然需要ORDER BY,请查看MySQL 文档中的ORDER BY Optimization。此处不使用索引进行排序的原因是不同的GROUP BYORDER BY子句。

跳出框框思考。您没有进行任何聚合,因此可能不需要分组。也许只是拉所有的行,然后忽略重复的 id。

于 2012-06-21T17:47:33.280 回答
0

尝试将 trip_headsign 添加到您的“路线”索引中。因为您在 ORDER BY 中使用它,所以 mysql 需要转到实际表以获取它在与 route_id 匹配的索引中找到的每条记录。如果在说明的 Extra 列中没有看到“Using index”,则意味着 MySQL 被迫返回实际表以获取更多信息。

于 2012-06-21T20:03:36.630 回答