【发布时间】:2011-04-22 23:59:45
【问题描述】:
我发现自己陷入了困境。我有一个用于页面点击跟踪的表,有近 1.05 亿行。(!)它看起来像这样:
CREATE TABLE `media_hits` (
`id` int(10) unsigned NOT NULL auto_increment,
`media_code` char(7) NOT NULL,
`day` date NOT NULL,
`hits` int(10) unsigned NOT NULL default '0',
PRIMARY KEY (`id`),
UNIQUE KEY `media_code` (`media_code`,`day`)
) ENGINE=InnoDB;
您可以想象在此表上运行任何类型的查询都需要很长时间。一个典型的查询如下:
SELECT DISTINCT(`media_code`), COUNT(*) AS c
FROM `media_hits`
WHERE `day` >= DATE_SUB(NOW(), INTERVAL 1 DAY)
GROUP BY(`media_code`)
ORDER BY c DESC
LIMIT 200;
这个查询需要很长时间。查询中的 EXPLAIN 给了我这个:
id: 1
select_type: SIMPLE
table: media_hits
type: index
possible_keys: NULL
key: media_code
key_len: 10
ref: NULL
rows: 104773158
Extra: Using where; Using index; Using temporary; Using filesort
这简直太糟糕了。所以我的问题是:我能做些什么呢?现在尝试添加正确的索引是不可能的。 ALTER TABLE 查询可能需要一周多的时间才能运行。我尝试删除超过 6 个月的行,但 24 小时后该查询仍在运行。
我需要解决这个问题。我唯一想到的是创建一个具有适当索引的新表,并开始在该表中记录命中。在后台,我可以有一个脚本从旧的 media_hits 表中缓慢插入记录。谁能提供有关如何索引此表的建议,以及我应该索引哪些列的一些提示?
【问题讨论】:
标签: mysql