我之前问过一个关于如何分析大型数据集的问题(如何分析 13GB 的数据)。一个有希望的回应是使用自然键将数据添加到 MySQL 数据库中,从而利用 INNODB 的聚集索引。
我已将数据添加到数据库中,其架构如下所示:
TorrentsPerPeer
+----------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+------------------+------+-----+---------+-------+
| ip | int(10) unsigned | NO | PRI | NULL | |
| infohash | varchar(40) | NO | PRI | NULL | |
+----------+------------------+------+-----+---------+-------+
这两个字段共同构成主键。
该表表示已知的对等点下载种子的实例。我希望能够提供有关在同行中可以找到多少种子的信息。我将绘制我看到种子数量的频率的直方图(例如,20 个对等点有 2 个种子,40 个对等点有 3 个,...)。
我写了以下查询:
SELECT `count`, COUNT(`ip`)
FROM (SELECT `ip`, COUNT(`infohash`) AS `count`
FROM TorrentsPerPeer
GROUP BY `ip`) AS `counts`
GROUP BY `count`;
这是EXPLAIN
子选择:
+----+-------------+----------------+-------+---------------+---------+------------+--------+----------+-------------+
| id | select_type | table | type | possible_keys | key | key_length | ref | rows | Extra |
+----+-------------+----------------+-------+---------------+---------+------------+--------+----------+-------------+
| 1 | SIMPLE | TorrentPerPeer | index | [Null] | PRIMARY | 126 | [Null] | 79262772 | Using index |
+----+-------------+----------------+-------+---------------+---------+------------+--------+----------+-------------+
我似乎无法EXPLAIN
为完整的查询做一个,因为它需要的时间太长了。这个错误表明这是因为它首先运行子查询。
此查询当前正在运行(并且已经运行了一个小时)。top
报告说mysqld
它只使用了大约 5% 的可用 CPU,而它却在RSIZE
稳步增长。我的假设是服务器正在 RAM 中构建用于完成查询的临时表。
我的问题是;如何提高此查询的性能?我应该以某种方式更改查询吗?我一直在更改my.cnf
文件中的服务器设置以增加 INNODB 缓冲池大小,我应该更改任何其他值吗?
如果重要的话,该表的深度为 79'262'772 行,并占用约 8GB 的磁盘空间。我不希望这是一个简单的查询,也许“耐心”是唯一合理的答案。
编辑只是补充一下查询已经完成并且花了 105 分钟。这不是无法忍受的,我只是希望有一些改进。