mysql - 优化 SQL group by 和 join 查询

标签 mysql sql query-optimization

我有两个大的用户表和购买表(分别为 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/

相关文章:

MySQL 数据库 - 将数据存储在一个表中或使用查找

MySQL:如何在 mysql 中获取列表 innodb 文件名?

php - 使用简单的类似查询获取数据问题

sql - 从函数返回 CASE 表达式的聚合

c# - 不在 linq to sql 之间

sql - 更改SSRS散点图中水平轴的顺序?

mysql - 我的大型 mysql 表注定要失败吗?

php - 非常简单 RE : New Lines in PHP when sourcing mySQL in a form

mysql - 如何从mysql表中按月获取记录数?

mysql - mysql中多个查询的总运行时间