[英]mysql update command with multiple similar sub-selects
我編寫了以下UPDATE命令,但子選擇中存在冗余。 我不是SQL方面的專家,希望能幫助您提高查詢效率。 提前謝謝。
update trips
set origin =
(select stop_name
from stops
inner join stop_times
on stops.stop_id = stop_times.stop_id
where stop_times.trip_id = trips.trip_id
order by stop_sequence asc
limit 1)
,
destination =
(select stop_name
from stops
inner join stop_times
on stops.stop_id = stop_times.stop_id
where stop_times.trip_id = trips.trip_id
order by stop_sequence desc
limit 1)
,
starts =
(select arrival_time
from stop_times
where stop_times.trip_id = trips.trip_id
order by stop_sequence asc
limit 1)
,
ends =
(select arrival_time
from stop_times
where stop_times.trip_id = trips.trip_id
order by stop_sequence desc
limit 1)
;
以下是相關的表定義。 大約有72K次旅行,8000次停靠和200萬次停靠時間。 也許平均20? 每次旅行停止(只是猜測)。
create table stop_times (
trip_id varchar(255),
arrival_time time,
stop_id varchar(255),
stop_sequence int unsigned,
) type=MyISAM;
alter table stop_times add index stop_id (stop_id(5));
alter table stop_times add index trip_id (trip_id(5));
create table stops (
stop_id varchar(255),
stop_name varchar(255),
stop_lat float,
stop_lon float,
primary key (stop_id)
) type=MyISAM;
create table trips (
route_id varchar(255),
trip_id varchar(255), /* primary key is here */
/* denormalized fields */
origin varchar(255),
destination varchar(255),
starts time,
ends time,
primary key(trip_id)
) type=MyISAM;
alter table trips add index route_id (route_id(5));
首先在stop_times上添加一個索引,以包含trip_id和stop_sequence列
ALTER TABLE stop_times ADD PRIMARY KEY(trip_id, stop_sequence)
然后,嘗試運行此更新:
update trips t JOIN (
SELECT trip_id, MIN(stop_sequence) minS, MAX(stop_sequence) maxS
FROM stop_times
GROUP BY trip_id
) tg ON t.trip_id = tg.trip_id
JOIN stop_times stFirst ON tg.trip_id = stFirst.trip_id AND stFirst.stop_sequence = tg.minS
JOIN stop_times stLast ON tg.trip_id = stLast.trip_id AND stLast.stop_sequence = tg.maxS
JOIN stops stFirstStop ON stFirst.stop_id = stFirstStop.stop_id
JOIN stops stLastStop ON stLast.stop_id = stLastStop.stop_id
SET t.origin = stFirstStop.stop_name,
t.destination = stLastStop.stop_name,
t.starts = stFirst.arrival_time,
t.ends = stLast.arrival_time
注意:將trip_id更改為INT可以提高性能
另外,行程表應該存儲origin_id和destination_id,以后可以將它們與stops表連接以查找名稱,而不是在所有行中存儲名稱
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.