2012-12-22 98 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