Я хочу сохранить изменения, которые я делаю в своей таблице "entity". Это должно быть похоже на журнал. В настоящее время он реализуется с помощью этой таблицы в 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 дней. Например: последние изменения с SOMEDOUBLE
для entity_id 123
в течение последних 15 дней.
Теперь есть две вещи, которые мне не нравятся:
- Все данные хранятся как
TEXT
- хотя большинство (менее 1%) на самом деле не текст, в моем случае большинство значенийDOUBLE
. Это большая проблема? - При вставке таблица становится действительно очень медленной, поскольку в таблице уже 200 миллионов строк. Из-за этого моя загрузка на моем компьютере составляет до 10-15.
Мой вопрос: Как мне адресовать эти два "узких места"? Мне нужно масштабировать.
Мои подходы:
- Сохраните его следующим образом: http://sqlfiddle.com/#!2/df9d0 (нажмите на просмотр). Сохраните изменения в таблице
entitychange
, а затем сохраните значение в соответствии с его типом данных вentitychange_[bool|timestamp|double|string]
- Используйте разбиение на
HASH(entity_id)
- я думал о ~ 50 разделах. - Должен ли я использовать другую систему баз данных, возможно, MongoDB?