【发布时间】:2013-10-05 16:27:04
【问题描述】:
考虑下表:
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 WHEREtime< unix_timestamp()-100*86400; - 声明 #2:
DELETE FROM event WHEREtime< unix_timestamp()-100*86400 LIMIT 1000;
- 声明 #1:
- 用户将
SELECT所有事件按UID,每天总共约500个查询,所以不是那么多:- 声明 #1:
SELECT * FROM event WHEREuid=4711 ANDtypeIN (23,1002,12,1); - 声明 #2:
SELECT * FROM event WHEREuid=4711 ANDtypeIN (23,1002,12,1) ANDtimeBETWEEN 1381051061 AND 1381051861;
- 声明 #1:
处理这张桌子变得很慢,特别是因为DELETE 作业阻塞了桌子上的INSERTs/SELECTs。如上所述(声明#1),我们尝试了每日批量DELETE,如果不阻塞表格,它就不再起作用了。目前我们每 30 秒删除一次(声明 #2),但这会阻塞 10 秒。
我们计划增加INSERT 负载,但第一次测试导致线程挂在“系统块”状态,我猜这是由于 I/O。服务器设置按照 mysqltuner.pl 的建议进行了优化。硬件系统肯定有 I/O 问题并且是“原样”,不幸的是它不能因为几个原因而改变。我们甚至没有 root 访问权限。
分区甚至是一种解决方案吗?MyISAM 是最好的引擎吗?在改进硬件之前,我们需要优化任何东西。
【问题讨论】:
-
投票结束:范围太广。令人着迷的问题,但过于宽泛,无法在这里明确回答,并且可以说不是严格意义上的编程问题。我们可以告诉你如何分区,但我们不能抽象地优化。为什么不是 InnoDB?服务器设置是什么?什么是系统规格和负载?还有哪些其他查询正在运行?你多久删除一次,可以更频繁吗?您是否有适合您的查询模式的索引? (我的猜测是,不完全是。)等等。
-
感谢您的 cmets。我知道为一个广泛的问题提供优化提示有点困难。我认为处理这样的数据可能是一个普遍的问题。我添加了更多细节,希望对您有所帮助。
-
dba.stackexchange 可能是一个更好的地方来询问哪种优化是合适的以及如何衡量它们的有效性。
标签: mysql sql performance database-partitioning