繁体   English   中英

MySQL查询非常慢

[英]MySQL queries very slow

所以我有一个很大的数据库,并且每天都在增长。 但是我不太了解如何更快地使用它。 我也不知道索引如何工作。

这是我数据库中的表:
第一个表格是包含所有车辆信息的表格:

nm_voertuig:

+----+----------+------+--------+--------+-------+
| id | kenteken | merk | model  | deuren | kleur |
+----+----------+------+--------+--------+-------+
|  1 | 12KT43   | Opel | ZAFIRA |      5 | Blue  |
|  2 | G345CP   | Audi | A3     |      3 | Black |
+----+----------+------+--------+--------+-------+


在此处输入图片说明
该表中有500万行。


nm_voertuig_statistieken:

+----+------------+----------+-------+---------+
| id |   datum    | kenteken | prijs | kmstand |
+----+------------+----------+-------+---------+
|  1 | 2016-01-05 | 12KT43   |  5000 |  150000 |
|  1 | 2016-01-06 | 12KT43   |  4900 |  150000 |
|  2 | 2016-01-05 | G345CP   | 12000 |  100000 |
+----+------------+----------+-------+---------+


在此处输入图片说明
每天数据库将填充当天的价格。 因此,只要汽车仍然可用,每天都会有新的一排。

因此,例如,我想获得一个欧宝赛飞利的最小和最大行驶里程。 这是我尝试过的查询:

SELECT      MIN(kmstand), MAX(kmstand)
FROM        (
                SELECT v.id
                FROM nm_voertuig v
                WHERE merk = 'Opel' AND model = 'ZAFIRA'
            ) AS cnt
JOIN nm_voertuig_statistieken vs
ON cnt.id = vs.id

执行此查询需要很长时间: 在此处输入图片说明

我怎样做才能使查询更快?

编辑:
从nm_voertuig解释选择*:
在此处输入图片说明

从nm_voertuig_statistieken解释选择*:
在此处输入图片说明

首先,您应该重写查询。 MySQL中的子查询会产生实现所需的开销。 所以:

SELECT MIN(vs.mileage), MAX(vs.mileage)
FROM nm_voertuig v JOIN
     nm_voertuig_statistieken vs
     ON v.id = vs.id
WHERE v.make = 'Opel' AND v.model = 'ZAFIRA';

然后,对于此索引,您需要以下索引:

CREATE INDEX idx_nm_voertuig_make_model_id
    ON nm_voertuig(make, model, id);

CREATE INDEX idx_nm_voertuig_statistieken_id_milage
    ON nm_voertuig_statistieken(id, mileage);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM