0

次のクエリを実行しようとしています。

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      |         |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+

ファイルソートは良いことではないことはわかっていますが、どうすればそれを取り除くことができますか?

4

1 に答える 1

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)それが使用されているかどうかを説明します (「インデックスの使用」が表示されるはずです)。

于 2012-04-19T09:58:47.490 に答える