2016-06-08 120 views
1

所以我有两个表:的MySQL查询的语句组合非常缓慢

| id  | make  | model  | color | 
| 1234 | BMW  | M2   | blue  | 
| 2345 | Audi  | A3   | black | 

| id  | date  | price  | 
| 1234 | 2015-09-23 | 34000  | 
| 1234 | 2015-10-23 | 33500  | 

第一个表有50多辆独一无二的。第二个表有从日常的车辆价格几天(将更多的未来)

现在我想执行一个简单的连接语句:如果我删除加入

SELECT  count(v.id) 
FROM   nm_voertuig v 
JOIN   nm_voertuig_statistieken vs 
ON   v.id = vs.id 
WHERE   model = 'BRZ' 

它的速度非常快,但加入后需要大约20秒的时间才能加载。
我试图添加一些索引。但它似乎没有帮助。

我在做什么错?

EDIT
指标的nm_voertuig: https://gyazo.com/cd1628862574ee3c7beb0520484819cc

编辑2
这是由该结果说明: https://gyazo.com/18c1ad77718e8cdf9d19a3846cc4472c

+5

指标?经验法则是在涉及“决定”上下文的所有字段上放置索引:“join”,“where”,“order by”等... select count()对于某些表类型可能基本上是瞬时的,因为行计数存储在表的元数据中,并且数据库不必计算实际记录。 –

+0

您的索引包含哪些字段? – knittl

+0

我真的不知道索引是如何工作的。将使用索引编辑我的文章 –

回答

2

@Wouter巢穴Ouden:

我看到您的查询使用索引。

试试这个:先快速计数,只加入一行而不是全部加入。

SELECT cnt.*, vs.* FROM (
    SELECT  count(v.id), id 
    FROM   nm_voertuig v 
    WHERE   model = 'BRZ' 
) AS cnt 
JOIN   nm_voertuig_statistieken vs 
ON   cnt.id = vs.id; 

请让我知道它是否适合你什么

+0

它确实工作,它确实快得多 –