0

私はこのクエリを持っています:

select * from 

実行すると、35k レコードで約 45 秒かかります。毎日、5,000 件以上の新しいレコードをgps_unit_locationテーブルに追加しています。したがって、テーブルが大きくなります。すべての ID の現在のインデックス。インデックスを追加すると、このクエリのパフォーマンスが向上しますか?

ありがとう。

4

2 に答える 2

2

そう、

  1. 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
    
  2. その星が付いているすべてのフィールドを本当に選択する必要があることを確認してください*

  3. このクエリを試してください:

    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
    

余談ですが、主キーとして定義されている列に一意のインデックスは必要ないと思います。これにより、挿入/更新ステートメントで書き込みオーバーヘッドが発生します。

于 2013-02-16T02:46:50.310 に答える
1

一般的な答えは、結合と制約に使用される列(ON句とWHERE句)にインデックスを付けることです。複合インデックスを使用します(最初に結合し、次にカーディナリティ制約が最も低い制約を最初に使用します)。

ああ、すべてのIDを「署名なし」にします。

于 2013-02-16T02:15:49.043 に答える