我想将我所做的更改存储在我的“实体”表上。这应该像一个日志。目前它在 MySQL 中使用此表实现:
CREATE TABLE `entitychange` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`entity_id` int(10) unsigned NOT NULL,
`entitytype` enum('STRING_1','STRING_2','SOMEBOOL','SOMEDOUBLE','SOMETIMESTAMP') NOT NULL DEFAULT 'STRING_1',
`when` TIMESTAMP NOT NULL,
`value` TEXT,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
entity_id
entity
= 我的表的主键。entitytype
= 表中已更改的entity
字段。有时只更改一个字段,有时更改多个字段。一次更改 = 一行。value
= 字段“新值”的字符串表示形式。
将字段entity.somedouble
从 3 更改为 2 时的示例,我运行这些查询:
UPDATE entity SET somedouble = 2 WHERE entity_id = 123;
INSERT INTO entitychange (entity_id,entitytype,value) VALUES (123,'SOMEDOUBLE',2);
我需要select
过去 15 天的特定实体和实体类型的更改。例如:在过去 15 天内最后一次更改SOMEDOUBLE
为 entity_id 。123
现在,有两件事我不喜欢:
- 所有数据都存储为
TEXT
- 尽管大多数(少于 1%)不是真正的文本,但在我的情况下,大多数值都是DOUBLE
. 这是一个大问题吗? - 插入时,表变得非常非常慢,因为表已经有 2 亿行。因此,目前我的服务器负载高达 10-15。
我的问题:我如何解决这两个“瓶颈”?我需要扩展。
我的方法是:
- 像这样存储它:http ://sqlfiddle.com/#!2/df9d0 (单击浏览)-将更改存储在
entitychange
表中,然后根据其数据类型将值存储在entitychange_[bool|timestamp|double|string]
- 使用分区
HASH(entity_id)
- 我想到了大约 50 个分区。 - 我应该使用另一个数据库系统,也许是 MongoDB?