我有两个大的用户表和购买表(分别为 10^6 和 10^8 行)。 我在下面使用 mySql 在这里运行查询,但是计算需要很长时间! 加快执行速度的最佳方法是什么?我应该使用索引还是将查询拆分为两个查询?
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;
我想问题出在 Type:All 上。解释给了我这个:
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
最佳答案
你需要这两个索引:
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:你应该为每个表定义一个主键,虽然这不是这个特定查询的问题。
关于mysql - 优化 SQL group by 和 join 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19465281/