考虑下表:
CREATE TABLE `event` (
`uid` bigint(13) NOT NULL,
`time` bigint(14) NOT NULL,
`type` smallint(5) NOT NULL,
`msg` varchar(2048) DEFAULT NULL,
KEY `uid` (`uid`),
KEY `time` (`time`),
KEY `time_type_uid` (`time`,`type`,`uid`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
我基本上做什么:
INSERT
每天约 100 万行,当前大小约为 1 亿个条目DELETE
超过 100 天的所有行:- 声明#1:
DELETE FROM event WHERE
time
< unix_timestamp()-100*86400; - 声明#2:
DELETE FROM event WHERE
time
< unix_timestamp()-100*86400 LIMIT 1000;
- 声明#1:
- 用户将按
SELECT
UID 处理所有事件,每天总共大约 500 个查询,所以不是那么多:- 声明#1:
SELECT * FROM event WHERE
uid
=4711 ANDtype
IN (23,1002,12,1); - 声明#2:
SELECT * FROM event WHERE
uid
=4711 ANDtype
IN (23,1002,12,1) ANDtime
BETWEEN 1381051061 AND 1381051861;
- 声明#1:
处理这张桌子变得很慢,特别是因为桌子上的DELETE
作业阻塞了INSERT
s/ SELECT
s。DELETE
我们尝试了如上所述的每日批量(声明#1),如果不阻塞表,它就不再起作用了。目前我们每 30 秒删除一次(声明 #2),但这会阻塞 10 秒。
我们计划增加INSERT
负载,但第一次测试导致线程挂在“系统块”状态,我猜这是由于 I/O。服务器设置按照 mysqltuner.pl 的建议进行了优化。硬件系统肯定有 I/O 问题并且是“原样”,不幸的是它不能因为几个原因而改变。我们甚至没有root访问权限。
分区甚至是一种解决方案吗?MyISAM 是最好的引擎吗?在改进硬件之前,我们需要优化任何东西。