我发现自己陷入了一个困境。我有一张用于页面访问跟踪的表格,其中包含近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查询可能需要超过一周才能运行。我试图删除六个月前的行,但24小时后该查询仍在运行。
我需要想办法解决这个问题。唯一想到的事情是创建一个新的具有正确索引的表,并开始在该表中记录点击次数。在后台,我可以使用脚本从旧的media_hits表中缓慢插入记录。有没有人能提供有关如何为此表建立索引以及可能应该为哪些列建立索引的提示?