Выберите движок Mysql для обработки большой таблицы «тип-значение» - PullRequest
0 голосов
/ 25 января 2011

Моя задача - удалить из базы данных все объекты, которые не были затронуты во время операции. Я создал отдельную таблицу, в которой есть два столбца, первый представляет имя таблицы, а второй - идентификатор записи в этой таблице.

CREATE TABLE edited_entities (
        table VARCHAR(50) not null, 
        id BIGINT(20) not null)

Например, если у меня есть таблица

CREATE TABLE puppy(
        id BIGINT(20) not null, 
        name VARCHAR(20) not null)

и запись в нем

id | name
1  | Rex

Если я отредактирую эту запись, я добавлю следующие данные в edited_entities:

table | id
puppy | 1

Затем мне нужно удалить все незатронутые объекты (идентификаторы которых отсутствуют в таблице edited_entities), и я делаю следующее:

delete from puppy where id not in 
    (select ee.id from edited_entities ee where ee.table= 'puppy');

Интересно, какой двигатель лучше всего подходит для такой операции (MySql)? ДБ по умолчанию является InnoDB. Я думал о памяти (кучи), но я не уверен, может ли она ускорить операцию удаления.

Если у вас есть предложение, как я могу оптимизировать требуемую операцию, я буду рад здесь это.

Мне не нужно добавлять дополнительные столбцы в таблицу щенков.

1 Ответ

0 голосов
/ 25 января 2011

Память будет быстрее, так как в конце транзакции не нужно переходить на диск.В этом случае я бы попробовал сначала BTREE, а не HASH-индекс, потому что он позволяет вам использовать частичные составные индексы, как и таблицы на диске.

Также попробуйте с подготовленными инструкциями для операций вставки и удаления: подготовьте один изкаждый перед обработкой, а затем вызвать с соответствующими параметрами. может быть быстрее, так как не нужно анализировать SQL;но в некоторых случаях вся система становится немного медленнее, потому что они занимают нетривиальные объемы памяти.

Другой вариант - экспериментальная функция HandlerSocket , доступная в нескольких форках.MySQL, как и сервер Percona , позволяет получить доступ к таблице MySQL в качестве хранилища NoSQL с огромным выигрышем в производительности, но с полным соответствием ACID.(Люди из Percona - фанатики производительности; даже если вы не можете использовать HandlerSocket, обязательно протестируйте их ответвление)

Наконец, жизнеспособный (но более трудоемкий) вариант - это отдельная база данных в памяти.Я бы предпочел пойти с Redis , который является очень высокоскоростным хранилищем ключей-значений в памяти с добавленной особенностью, что «значения» являются полезными структурами данных.В вашем случае вы можете сохранить набор идентификаторов для каждой таблицы, например,

tokeep:puppy => 1,4,6,76.....

, это простая (и атомарная) операция по добавлению элемента в набор (SADD tokeep:puppy 76), и наВ конце концов, вы извлекаете их все для создания операции SQL DELETE WITH id NOT IN (...)

И самый последний вариант, о котором я думаю (и еще больше работы для вас), состоит в том, чтобы поместить все в один и тот же магазин: есть форкRedis, ранее назывался redisql, но теперь это База данных алхимии ;он добавляет таблицы SQL в Redis, сохраняя большинство преимуществ производительности NoSQL.Таким образом, вы можете иметь свои «обычные» таблицы в виде таблиц SQL в Alchemy, хранить наборы «tokeep» в NoSQL на том же сервере и в конце сделать:

DELETE FROM puppy WHERE id NOT IN ($SMEMBERS tokeep:puppy );

Bam!

...