2012-12-22 100 views
2

我对产品的表如下指标:(product_t,产品ID,可供出售)。 MySQL手册说:GROUP BY会减慢查询

本集团名称仅构成该指数并没有其他列的最左边的前缀列。 http://dev.mysql.com/doc/refman/5.0/en/group-by-optimization.html

当我做下面的查询

SELECT z.product_t, COUNT(z.productid) 
FROM xcart_products z 
JOIN xcart_products_lng w ON z.productid = w.productid 
AND w.code = 'US' 
WHERE z.forsale = 'Y' 
group by z.product_t 

并因此使用最左边的索引字段(product_t),执行时间仍然是巨大的:

+-----------+--------------------+ 
| product_t | COUNT(z.productid) | 
+-----------+--------------------+ 
| B   |     4 | 
| C   |    10521 | 
| D   |     1 | 
| F   |     16 | 
| G   |    363 | 
| J   |     16 | 
| L   |    749 | 
| M   |     22 | 
| O   |    279 | 
| P   |    5304 | 
| S   |     22 | 
| W   |    662 | 
+-----------+--------------------+ 
12 rows in set (0.81 sec) 

当我使用整个索引(product_t,productid,forsale),执行时间非常快(0.005秒)。我应该如何改变它以使查询更快?

enter image description here

我觉得莫名其妙查询可以通过使用半的加入可以改善......但是我不知道

+0

我认为它最好完成 –

+0

@GrijeshChauhan请检查我的新答案。我设法做到了这一点哈哈 – bicycle

+0

好的没什么是不可能的! ..很好..我也会读你的答案。 –

回答

1

慢下来可能不会BY子句中涉及到该组。尝试单独为w.code和z.forsale添加一个索引。

MySQL Profiling也可以帮助你在你的努力

+0

增加对w.code索引和z.forsale可惜没有提高什么。我检查了分析,我看到了一个异议。主要的瓶颈是发送数据0.124638 – bicycle

+0

请检查我的新答案。我设法做到这一点哈哈 – bicycle

0

最明显的答案会怎样?是仅为product_t创建新索引。你创造新的索引?

+0

然而我认为你可以每个查询只使用一个表...我已经添加了执行计划和两个索引。我提到的一个(product_t,productid,forsale)和第二个只有product_t。你可以看到它只需要第一个。如果不会,在可供出售和产品ID字段将放缓了查询... – bicycle

0

值得庆幸的是我找到了一种方法如何提高速度。我确实有另一个表,其中所有product_t都被定义。每个product_t还使用'code'字段(指定每个product_t的翻译)。在这个表中,我有一个在product_t和代码上定义的索引。通过更改查询为:

SELECT z.product_t, COUNT(z.productid) 
FROM xcart_products z 
JOIN xcart_products_lng w ON z.productid = w.productid 
JOIN xcart_products_product_t_lng p ON z.product_t = p.product_t 
AND p.code = 'US' 
WHERE z.forsale = 'Y' 
group by p.product_t,p.code 

我设法提高到0.10秒的速度。之所以更快是因为分组现在是在整个索引上完成的。其次,将where code ='US'从大products_lng表中替换为小product_t_lng表。我认为这是最有效的查询可以...

mysql> SELECT z.product_t, COUNT(z.productid) 
     -> FROM xcart_products z 
     -> JOIN xcart_products_lng w ON z.productid = w.productid 
     -> JOIN xcart_products_product_t_lng p ON z.product_t = p.product_t 
     -> AND p.code = 'US' 
     -> WHERE z.forsale = 'Y' 
     -> GROUP BY p.product_t, p.code 
     -> ; 
    +-----------+----------------------+ 
    | product_t | COUNT(z.productid) | 
    +-----------+----------------------+ 
    | B   |     4 | 
    | C   |    10521 | 
    | F   |     16 | 
    | G   |     363 | 
    | L   |     749 | 
    | M   |     22 | 
    | O   |     279 | 
    | P   |     5304 | 
    | S   |     22 | 
    | W   |     662 | 
    +-----------+----------------------+ 
    10 rows in set (0.14 sec) 
+0

不错,你有多少数据检查出来?......我的建议与大尺寸的检查。 –

+0

@GrijeshChauhan谢谢! 22,343款产品。该数据库只是使用正常的设置,并没有被调整。 – bicycle