MySQL查询速度很慢

时间:2016-09-13 14:14:19

标签: php mysql

所以我有一个非常大的数据库,每天都在变大。但我真的不明白如何更快地使用它。我也不知道索引是如何工作的。

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

nm_voertuig:

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


enter image description here
在这个表中就像500000行。


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


enter image description here
每天数据库将填充当天的价格。因此,只要汽车仍然可用,它每天都会有新的一排。

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

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

执行此查询需要很长时间: enter image description here

我可以做些什么来加快查询速度?

修改
从nm_voertuig解释select *:
enter image description here

从nm_voertuig_statistieken解释select *:
enter image description here

1 个答案:

答案 0 :(得分:2)

首先,您应该重写查询。 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);