所以我有一个非常大的数据库,每天都在变大。但我真的不明白如何更快地使用它。我也不知道索引是如何工作的。
这是我数据库中的表格:
第一张表是包含所有车辆信息的表格:
nm_voertuig:
+----+----------+------+--------+--------+-------+
| id | kenteken | merk | model | deuren | kleur |
+----+----------+------+--------+--------+-------+
| 1 | 12KT43 | Opel | ZAFIRA | 5 | Blue |
| 2 | G345CP | Audi | A3 | 3 | Black |
+----+----------+------+--------+--------+-------+
在这个表中就像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 |
+----+------------+----------+-------+---------+
每天数据库将填充当天的价格。因此,只要汽车仍然可用,它每天都会有新的一排。
因此,例如我想获得欧宝赛飞利的最小和最大里程数。
这是我试过的查询:
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解释select *:
从nm_voertuig_statistieken解释select *:
答案 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);