次のUPDATEコマンドを書きましたが、サブ選択に冗長性があります。私はSQLの専門家ではなく、このクエリをより効率的にするための助けに感謝します。早めにありがとう。複数の同様のサブ選択を持つmysql updateコマンド
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 トリップ、8Kストップ、および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));
どのように非効率であると測定しましたか? –
テーブルの定義だけでなく、旅行ごとに何回停止するかを記入してください。 –
私はそれがより良い解決策に比べて非効率かどうか分かりません。私は大規模なデータセットでこれを実行しており、それは何分もかかります。限り、SQLが行く、それはあなたに見えるか? – dan