私はこのクエリを持っています:
select * from
実行すると、35k レコードで約 45 秒かかります。毎日、5,000 件以上の新しいレコードをgps_unit_location
テーブルに追加しています。したがって、テーブルが大きくなります。すべての ID の現在のインデックス。インデックスを追加すると、このクエリのパフォーマンスが向上しますか?
ありがとう。
私はこのクエリを持っています:
select * from
実行すると、35k レコードで約 45 秒かかります。毎日、5,000 件以上の新しいレコードをgps_unit_location
テーブルに追加しています。したがって、テーブルが大きくなります。すべての ID の現在のインデックス。インデックスを追加すると、このクエリのパフォーマンスが向上しますか?
ありがとう。
そう、
NOT NULL
列とインデックスがあることを確認してください:
INDEX ON gps_unit_location.idgps_unit_location
INDEX ON user.iduser
INDEX ON user_to_gps_unit.iduser
INDEX ON user_to_gps_unit.idgps_unit
INDEX ON gps_unit.idgps_unit
INDEX ON gps_unit_location.idgps_unit
その星が付いているすべてのフィールドを本当に選択する必要があることを確認してください*
このクエリを試してください:
SELECT
`gps_unit`.`idgps_unit`,
`gps_unit`.`name as name`,
`gps_unit`.`notes as notes`,
`gps_unit`.`serial`,
`gps_unit_location`.`dt` as dt,
`gps_unit_location`.`idgps_unit_location`,
`gps_unit_location`.`lat`,
`gps_unit_location`.`long`,
`ip`,
`unique_id`,
`loc_age`,
`reason_code`,
`speed_kmh`,
`VehHdg`,
`Odometer`,
`event_time_gmt_unix`,
`switches`,
`engine_on_off`
FROM user
INNER JOIN user_to_gps_unit ON user.iduser = user_to_gps_unit.iduser
INNER JOIN gps_unit ON user_to_gps_unit.idgps_unit = gps_unit.idgps_unit
INNER JOIN gps_unit_location ON gps_unit.idgps_unit = gps_unit_location.idgps_unit
INNER JOIN
(SELECT
`gps_unit_location`.`idgps_unit`,
MAX(`gps_unit_location`.`dt`) dtmax
FROM `gps_unit_location`
GROUP BY 1
) r1 ON r1.idgps_unit = gps_unit_location.idgps_unit AND r1.dtmax = gps_unit_location.dt
WHERE
user.iduser = 14
余談ですが、主キーとして定義されている列に一意のインデックスは必要ないと思います。これにより、挿入/更新ステートメントで書き込みオーバーヘッドが発生します。
一般的な答えは、結合と制約に使用される列(ON句とWHERE句)にインデックスを付けることです。複合インデックスを使用します(最初に結合し、次にカーディナリティ制約が最も低い制約を最初に使用します)。
ああ、すべてのIDを「署名なし」にします。