首页 / MYSQL / MySQL:拥有1亿行的索引表
MySQL:拥有1亿行的索引表
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了MySQL:拥有1亿行的索引表,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1608字,纯文字阅读大概需要3分钟。
内容图文
![MySQL:拥有1亿行的索引表](/upload/InfoBanner/zyjiaocheng/906/576dbed9b50f4817a8fe48a678de553b.jpg)
我发现自己陷入了困境.我有一个用于页面命中跟踪的表,有近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表中慢慢插入记录.任何人都可以提供有关如何索引此表的建议,并可能提供一些关于我应该索引哪些列的提示?
解决方法:
对于这种工作,单独编制索引很可能对你没什么帮助.更好地考虑某种缓存策略,其中一些附加表存储了您需要的聚合.
例如,对于上面的查询,您可以添加第二个表“media_code_per_day”,其中包含3列“media_code”,“counter”和“date”.每次在原始表中插入一行时,也要相应地更新“media_code_per_day”.然后,您可以在“media_code_per_day”而不是原始查询上运行新查询.
当然,要在您的情况下初始化新表,您必须进行一次批量运行一次所有现有行,但这只需要一次.
内容总结
以上是互联网集市为您收集整理的MySQL:拥有1亿行的索引表全部内容,希望文章能够帮你解决MySQL:拥有1亿行的索引表所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。