2013-08-02 1 views
0

У меня более миллиарда уникальных строк, представляющих имена пользователей, и я добавляю миллионы больше каждые несколько минут одновременно, более 50% дубликатов. В настоящее время я использую таблицу InnoDB с mySQL. Я использую INSERT IGNORE, но сервер просто не может справиться с нагрузкой одновременного добавления миллионов (с использованием особого экземпляра EC2 процессора). Для борьбы с этим я храню имена пользователей навалом, когда прихожу и обновляю уникальную таблицу с помощью службы, когда это возможно.1 миллиард уникальных строк при одновременном вводе миллионов

Я открыт для любых предложений, которые я могу разумно настроить на экземпляр ec2. Возможно, redis может достичь того, что я хочу сделать, но я еще не использовал его. Может ли кто-нибудь предложить наиболее эффективный способ хранения более миллиарда уникальных строк при добавлении миллионов?

ответ

0

Узкое место обязано быть единственным числом поисков индекса каждый раз, когда он проверяет, является ли новый ключ дублированным, а также обновляет индекс каждый раз, когда вставлена ​​новая строка. Это нужно будет блокировать всю таблицу каждый раз, когда это происходит. Этот подход в конечном итоге не будет масштабироваться.

Предлагаю использовать для этого несколько экземпляров базы данных! Таким образом, эти операции вставки могут выполняться параллельно, через несколько машин и несколько дисков.

Затем вы использовали какой-то хэш, чтобы выяснить, какое имя будет указано в базе данных. Например, имена, начинающиеся с A-D, идут в одном, E-H идут в другом и т. Д.

+0

Спасибо за ваш ответ, вы уверены, что блокировка индекса становится проблемой. Я не думал об использовании нескольких баз данных на разных машинах, но это очень новое решение. Это потребует от меня значительно больших ресурсов для достижения, но я не против этого. – Codewithcheese

0

1) Я рекомендую MariaDB над MySQL - вы обычно получите лучшую производительность. MariaDB может иметь несколько активных мастеров для записи. Это замена для MySQL, если вы не знаете об этом.

2) У вас есть указатель на поле, в котором вы храните имена пользователей?

3) Redis - отличный вариант. Я использую его много, и это очень просто и быстро. Я все еще не могу сказать, насколько хорошо он будет работать под этой загрузкой, но его очень легко настроить и попробовать. Вы можете настроить кластер Redis, если вам нужно.

+0

Спасибо за ваш ответ, у меня действительно есть первичный индекс на именах пользователей, но с одновременной скоростью я делаю поиск ups и вставляет блокировку индекса становится проблемой. Я не уверен, что MariaDB решит это также с Redis – Codewithcheese

Смежные вопросы