Если по каким-то причинам вы не можете найти решения, использующие разные системы управления базами данных или разделить кластер, есть еще три основных вещи, которые вы можете сделать, чтобы радикально улучшить вашу производительность (и они работают в комбинация с кластерами тоже конечно):
- Настройка движка MyISAM-хранилища
- Использовать "ЗАГРУЗИТЬ ДАННЫЕ INFILE filename INTO TABLE tablename"
- Разделите ваши данные по нескольким таблицам
Вот и все. Остальное читайте, только если вас интересуют подробности:)
Все еще читаете? Хорошо, тогда вот что: MyISAM является краеугольным камнем, поскольку это самый быстрый двигатель на сегодняшний день. Вместо того, чтобы вставлять строки данных с помощью обычных операторов SQL, вы должны объединить их в файл и вставлять этот файл через равные промежутки времени (так часто, как вам нужно, но лучше всего, как позволяет ваше приложение). , Таким образом, вы можете вставить порядка миллиона строк в минуту.
Следующее, что ограничит вас, это ваши ключи / индексы. Когда они не помещаются в вашей памяти (потому что они просто слишком велики), вы будете испытывать огромное замедление как во вставках, так и в запросах. Вот почему вы разделяете данные на несколько таблиц, все по одной схеме. Каждая таблица должна быть настолько большой, насколько это возможно, без заполнения памяти при загрузке по одному. Конечно, точный размер зависит от вашей машины и индексов, но должен быть где-то между 5 и 50 миллионами строк / таблицей. Вы найдете это, если просто измерите время, необходимое для вставки огромного ряда строк за другим, в поисках момента, когда он значительно замедлится. Когда вы знаете предел, создавайте новую таблицу на лету каждый раз, когда ваша последняя таблица приближается к этому пределу.
Следствием многофункционального решения является то, что вам придется запрашивать все ваши таблицы, а не только одну, когда вам нужны какие-то данные, что немного замедлит ваши запросы (но не слишком сильно, если вы только) "есть миллиард или около того строк). Очевидно, что здесь есть и оптимизации. Если есть что-то фундаментальное, что вы можете использовать для разделения данных (например, дата, клиент или что-то еще), вы можете разделить это на разные таблицы, используя некоторый структурированный шаблон, который позволяет вам знать, где находятся определенные типы данных, даже не запрашивая таблицы. Используйте эти знания только для запросов к таблицам, которые могут содержать запрошенные данные и т. Д.
Если вам нужно еще больше настройки, перейдите на разбиение , как предложено Eineki и oedo.
Кроме того, чтобы вы знали, что все это не дикие предположения: я сейчас провожу некоторые тесты масштабируемости, подобные этим, на наших собственных данных, и этот подход творит чудеса для нас. Нам удается вставлять десятки миллионов строк каждый день, а запросы занимают ~ 100 мс.