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)

表格如下:

格式化_旅程:

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