2013-10-19 110 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