首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >针对Million+行优化MySQL查询/表

针对Million+行优化MySQL查询/表
EN

Stack Overflow用户
提问于 2014-11-22 09:02:33
回答 1查看 40关注 0票数 2

我是MySQL的新手,我正在尝试优化以下查询和/或表。非常感谢您的帮助,让它更有效率,以及任何解释!

查询:

代码语言:javascript
代码运行次数:0
运行
复制
SELECT SQL_CACHE
nick as viewer,
CONVERT(rank, UNSIGNED) as rank,
CONVERT(FLOOR(amount), UNSIGNED) as amount
FROM (
      SELECT @rank:=@rank+1 AS rank,
      nick,
      amount
      FROM  (
             SELECT nick, 
             SUM(amount) as amount 
             FROM points_log WHERE dt >= NOW()-INTERVAL 1 hour 
             GROUP BY nick
            ) as t1, 
     (SELECT @rank := 0) t2
     ORDER BY amount DESC
     ) as t3
WHERE nick='PrestonConnors';

输出:

代码语言:javascript
代码运行次数:0
运行
复制
+----------------+------+--------+
| viewer         | rank | amount |
+----------------+------+--------+
| prestonconnors |  521 |     13 |
+----------------+------+--------+
1 row in set (1.73 sec)

以下是查询的EXPLAIN输出:

代码语言:javascript
代码运行次数:0
运行
复制
+----+-------------+------------+--------+---------------+----------+---------+------+---    -----+----------------+
| id | select_type | table      | type   | possible_keys | key      | key_len | ref  | rows   | Extra          |
+----+-------------+------------+--------+---------------+----------+---------+------+--------+----------------+
|  1 | PRIMARY     | <derived2> | ALL    | NULL          | NULL     | NULL    | NULL |   5408 | Using where    |
|  2 | DERIVED     | <derived4> | system | NULL          | NULL     | NULL    | NULL |      1 | Using filesort |
|  2 | DERIVED     | <derived3> | ALL    | NULL          | NULL     | NULL    | NULL |   5408 |                |
|  4 | DERIVED     | NULL       | NULL   | NULL          | NULL     | NULL    | NULL |   NULL | No tables used |
|  3 | DERIVED     | points_log | index  | dt_idx        | nick_idx | 25      | NULL | 784143 | Using where    |
+----+-------------+------------+--------+---------------+----------+---------+------+--------+----------------+

下面是表格:

代码语言:javascript
代码运行次数:0
运行
复制
CREATE TABLE `points_log` (
  `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
  `nick` char(25) NOT NULL,
  `amount` decimal(8,4) NOT NULL,
  `stream_online` tinyint(1) NOT NULL,
  `modification_type` tinyint(3) unsigned NOT NULL,
  `dt` datetime NOT NULL,
  PRIMARY KEY (`id`,`dt`,`nick`),
  KEY `nick_idx` (`nick`),
  KEY `amount_idx` (`amount`),
  KEY `modification_type_idx` (`modification_type`),
  KEY `dt_idx` (`dt`),
  KEY `stream_online_idx` (`stream_online`)
) ENGINE=InnoDB AUTO_INCREMENT=866040 DEFAULT CHARSET=latin1
/*!50100 PARTITION BY RANGE ( YEAR(dt))
SUBPARTITION BY HASH ( MONTH(dt))
SUBPARTITIONS 12
(PARTITION p0 VALUES LESS THAN (2014) ENGINE = InnoDB,
 PARTITION p1 VALUES LESS THAN (2015) ENGINE = InnoDB,
 PARTITION p3 VALUES LESS THAN MAXVALUE ENGINE = InnoDB)
EN

回答 1

Stack Overflow用户

发布于 2014-11-22 10:29:48

我唯一能想到的就是建立一个索引:

代码语言:javascript
代码运行次数:0
运行
复制
points_log(dt, nick, amount)

如果您需要这方面的性能,可能需要创建一个汇总表。必须汇总整个表并使用触发器维护汇总表。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27072897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档