我正在玩费城交通数据,我有一个存储gtfs数据的sqlite数据库。我有这个查询在特定的站点寻找出发时间:
SELECT "stop_time".departure_time FROM "stop_time"
INNER JOIN "trip" ON "trip".trip_id = "stop_time".trip_id
WHERE
(trip.route_id = '10726' )
-- AND (trip.service_id = '1')
AND (stop_time.stop_id = '220')
AND (time( stop_time.departure_time ) > time('08:30:45'))
AND (time( stop_time.departure_time ) < time('09:30:45'));
将service_id与1匹配的子句目前已注释掉。如果我现在运行查询,而不匹配service_id,则需要2秒。如果我取消注释service_id子句,它将需要30个。我不知道为什么因为我已经在查看trip_id的trip表。
有什么想法吗?
答案 0 :(得分:0)
如果在service_id上没有过滤器时使用的(route_id,stop_id和departure_time)上定义了索引,则通常会发生这种情况。一旦在WHERE
子句中包含它,因为它不存在于索引中,它需要TABLE SCAN
,因此在执行时间内会出现问题。如果您还在索引定义中包含service_id
,那么TABLE SCAN
将替换为INDEX SCAN
。
答案 1 :(得分:0)
原因是你有一个service_id
的索引正在被选择,而不是另一个索引,和,service_id
的值不是很多,所以使用索引不是很有用,因为service_id = '1'
有很多行。