我想就事件记录器的 mysql 表设计提供建议。
我们的需求: - 跟踪大量动作 - 10 000 次动作/秒 - 此时 10 亿行
我们的硬件: - 2*Xeon(系统视为 32 CPU) - 128 GB RAM - 6*600 SSD with Raid 10
我们的餐桌设计:
CREATE TABLE IF NOT EXISTS `log_event` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`id_event` smallint(6) NOT NULL,
`id_user` bigint(20) NOT NULL,
`date` int(11) NOT NULL,
`data` bigint(20) NOT NULL,
PRIMARY KEY (`id`),
KEY `id_event_2` (`id_event`,`data`),
KEY `id_inscri` (`id_inscri`),
KEY `date` (`date`),
KEY `id_event_4` (`id_event`,`date`,`data`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8
ALTER TABLE `log_event`
ADD CONSTRAINT `log_event_ibfk_1` FOREIGN KEY (`id_inscri`) REFERENCES `inscription` (`id_inscri`) ON DELETE CASCADE ON UPDATE CASCADE;
我们的问题: - 我们有一个自动增量作为主要,但它并没有真正使用。删除它有问题吗?如果我们删除它,我们将没有主键 => 如何识别一行?
我们想做partionning,但是用foreign似乎是不可能的?
我们不做批量插入。在没有索引的内存表中插入并每 5 分钟复制一次数据是个好主意吗?
你有什么优化的想法吗?你有这种系统的最佳实践吗?
谢谢 !
弗朗索瓦