2012-04-19 11 views
0

私は次のクエリを実行しようとしています:MySQLのクエリ

SELECT formatted_journeys.*, MAX(speed) 
FROM formatted_journeys 
JOIN tracker.g_log 
    ON imeiid = vehicle 
    AND g_logid BETWEEN start_g_log AND end_g_log 
GROUP BY id 

しかし、非常に遅いと思われます。このクエリの説明は次のとおりです。次のように

+----+-------------+--------------------+------+-------------------------------+-------+---------+-----------------------------------+------+----------+---------------------------------+ 
| id | select_type | table    | type | possible_keys     | key | key_len | ref        | rows | filtered | Extra       | 
+----+-------------+--------------------+------+-------------------------------+-------+---------+-----------------------------------+------+----------+---------------------------------+ 
| 1 | SIMPLE  | formatted_journeys | ALL | vehicle,start_g_log,end_g_log | NULL | NULL | NULL        | 824 | 100.00 | Using temporary; Using filesort | 
| 1 | SIMPLE  | g_log    | ref | PRIMARY,Dupes     | Dupes | 4  | motrak.formatted_journeys.vehicle | 1985 | 100.00 | Using where      | 
+----+-------------+--------------------+------+-------------------------------+-------+---------+-----------------------------------+------+----------+---------------------------------+ 
2 rows in set, 1 warning (0.02 sec) 

テーブルは、次のとおり

formatted_journeys:

+-----------------+------------------+------+-----+---------+----------------+ 
| Field   | Type    | Null | Key | Default | Extra   | 
+-----------------+------------------+------+-----+---------+----------------+ 
| id    | int(11) unsigned | NO | PRI | NULL | auto_increment | 
| start_g_log  | int(11)   | YES | MUL | NULL |    | 
| end_g_log  | int(11)   | YES | MUL | NULL |    | 
| start_latitude | decimal(18,12) | YES |  | NULL |    | 
| start_longitude | decimal(18,12) | YES |  | NULL |    | 
| end_latitude | decimal(18,12) | YES |  | NULL |    | 
| end_longitude | decimal(18,12) | YES |  | NULL |    | 
| start_location | text    | YES |  | NULL |    | 
| end_location | text    | YES |  | NULL |    | 
| distance  | decimal(10,5) | YES |  | NULL |    | 
| start_date  | datetime   | YES |  | NULL |    | 
| end_date  | datetime   | YES |  | NULL |    | 
| vehicle   | int(11)   | YES | MUL | NULL |    | 
| private   | bit(1)   | NO |  | b'0' |    | 
+-----------------+------------------+------+-----+---------+----------------+ 

指数:

+--------------------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ 
| Table    | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | 
+--------------------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ 
| formatted_journeys |   0 | PRIMARY  |   1 | id   | A   |   830 |  NULL | NULL |  | BTREE  |   | 
| formatted_journeys |   1 | vehicle  |   1 | vehicle  | A   |   4 |  NULL | NULL | YES | BTREE  |   | 
| formatted_journeys |   1 | start_g_log |   1 | start_g_log | A   |   830 |  NULL | NULL | YES | BTREE  |   | 
| formatted_journeys |   1 | end_g_log |   1 | end_g_log | A   |   830 |  NULL | NULL | YES | BTREE  |   | 
+--------------------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ 

tracker.g_log:

+-----------+------------------+------+-----+---------+----------------+ 
| Field  | Type    | Null | Key | Default | Extra   | 
+-----------+------------------+------+-----+---------+----------------+ 
| g_logid | int(10) unsigned | NO | PRI | NULL | auto_increment | 
| imeiid | int(10) unsigned | NO | MUL | NULL |    | 
| latitude | decimal(18,12) | YES |  | NULL |    | 
| longitude | decimal(18,12) | YES |  | NULL |    | 
| speed  | int(4)   | YES | MUL | NULL |    | 
| bearing | int(4)   | YES |  | NULL |    | 
| distance | decimal(10,5) | YES |  | NULL |    | 
| eventcode | int(10)   | YES |  | NULL |    | 
| status | int(10)   | YES |  | NULL |    | 
| date  | datetime   | YES |  | NULL |    | 
+-----------+------------------+------+-----+---------+----------------+ 

インデックス:

+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ 
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | 
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ 
| g_log |   0 | PRIMARY |   1 | g_logid  | A   |  31760 |  NULL | NULL |  | BTREE  |   | 
| g_log |   0 | Dupes |   1 | imeiid  | A   |   16 |  NULL | NULL |  | BTREE  |   | 
| g_log |   0 | Dupes |   2 | date  | A   |  31760 |  NULL | NULL | YES | BTREE  |   | 
| g_log |   0 | Dupes |   3 | eventcode | A   |  31760 |  NULL | NULL | YES | BTREE  |   | 
| g_log |   1 | speed |   1 | speed  | A   |   423 |  NULL | NULL | YES | BTREE  |   | 
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ 

今、私はfilesortレコードは良いことではないことを知っているが、どのように私はそれを取り除くのでしょうか?

+0

@Arion:おかげで、編集のために、それを行うためにちょうど約ました。 – ridecar2

+0

問題はありません。私はあなたがどこで何を求めているのか分かりませんでした:P – Arion

+0

'tracker.g_log'テーブルに' journey_id'フィールドがあれば状況はもっと良く見えるかもしれません。 – newtover

答えて

0

Using temporary; Using filesortを取り除くことはほとんどありませんが、クエリが高速になる可能性があります。それは、クエリのために容易ではないですが、あなたは、カバレッジインデックスを使用するクエリを強制しようとすることができ、その後

SELECT * 
FROM (
    SELECT id, MAX(speed) as max_speed 
    FROM formatted_journeys 
    JOIN tracker.g_log 
    ON imeiid = vehicle 
     AND g_logid BETWEEN start_g_log AND end_g_log 
    GROUP BY id) as maxspeeds 
JOIN formatted_journeys USING (id); 

まず、としてクエリを書き直すしてみてください。

最初の試み:複合インデックス(vehicle, start_g_log, end_g_log)を追加し、(あなたがそこに「インデックスの使用」を参照してください必要があります)を使用するかどうかの説明で見ては

+0

それはどちらも速くはありません。 – ridecar2

+1

@ ridecar2の場合は、コンポジット '(imeiid、speed)'を追加してヒントを使って両方のインデックスを強制的に試そうとすることができます。それがうまくいかなければ、私は個人的にはそれをスピードアップする方法は見ません。しかし、私は十分な経験がないかもしれない=) – newtover