2013-10-19 164 views
1

我有用戶和購買(分別爲10^6和10^8行)的兩個大的表。 我使用mySql在下面運行查詢,但需要很長時間來計算! 加速執行的最佳方法是什麼?我應該使用索引還是將查詢拆分爲兩個查詢?優化SQL組由和連接查詢

CREATE TABLE user(
uID INTEGER, 
countryCode varchar(2) 
); 

CREATE TABLE purchases(
uID INTEGER, 
productID INTEGER, 
price INTEGER 
); 

SELECT U.countryCode AS country, SUM(P.price) AS amount 
FROM user U, purchases P 
WHERE U.uid = P.uid 
GROUP BY U.countryCode 
ORDER BY U.countryCode ASC; 

我想這個問題是在類型:全部。解釋給我:

id select_type  table type possible_keys key  key_len  ref  rows Extra 
1 SIMPLE U ALL  NULL NULL NULL NULL 9653 Using temporary; Using filesort 
1 SIMPLE P ALL  NULL NULL NULL NULL 97816 Using where; Using join buffer 
+1

上'countryCode'添加一個索引,然後執行'解釋選擇...'看到,如果你需要更多的索引('price'太)。 –

+0

這些需要'TEXT'數據類型的國家/地區代碼需要多長時間? –

+0

只是幾個字母......而我只是更改了varchar(2)中的TEXT – user2895890

回答

2

您需要這兩個指標:

CREATE INDEX USER_countryCode_uid ON user(countryCode,uid); 

CREATE INDEX PURCHASES_uid_price ON purchases(uid,price); 

EXPLAIN再提高:

*************************** 1. row *************************** 
      id: 1 
    select_type: SIMPLE 
     table: U 
     type: index 
possible_keys: USER_countryCode_uid 
      key: USER_countryCode_uid 
     key_len: 10 
      ref: NULL 
     rows: 10004 
     Extra: Using where; Using index 
*************************** 2. row *************************** 
      id: 1 
    select_type: SIMPLE 
     table: P 
     type: ref 
possible_keys: PURCHASES_uid_price 
      key: PURCHASES_uid_price 
     key_len: 5 
      ref: test.U.uID 
     rows: 1 
     Extra: Using index 

PS:你應該定義爲每個表的主鍵,雖然這不是此特定的查詢問題。

+0

非常好,這就是我一直在尋找的!謝謝比爾。我肯定會投票這個答案。 – user2895890

1

試試這個

CREATE INDEX countryCode_IDX用戶(COUNTRYCODE);

使用這個索引中查詢。

SELECT U.countryCode AS國家,SUM(P.Price)AS量爲用戶U FORCE INDEX(countryCode_IDX)LEFT JOIN購買P號U.uid = P.uid GROUP BY U.countryCode ORDER BY U. countryCode ASC;

使用UID列外鍵索引。

+0

OP的表(或主鍵)中沒有外鍵。 –

+0

這是行不通的,countryCode_IDX索引沒有加快速度。 – user2895890