Является ли InnoDB (MySQL 5.5.8) правильным выбором для многомиллиардных строк?

Итак, одна из моих таблиц в MySQL, которая использует движок хранения InnoDB, будет содержать многомиллиардные строки (с потенциально неограниченным количеством, которые будут вставлены).

Можете ли вы рассказать мне, какие оптимизации я могу сделать, чтобы ускорить работу? Причина с несколькими миллионами строк уже начинается медленно.

Конечно, если вы предлагаете использовать что-то еще. Единственные варианты, которые у меня есть, - PostgreSQL и Sqlite3. Но мне сказали, что sqlite3 не является хорошим выбором для этого. Что касается postgresql, я понятия не имею, как это происходит, поскольку я никогда не использовал его.

Я предполагаю, хотя, по крайней мере, около 1000-1500 вставок в секунду в этой таблице.

Ответ 1

Простой ответ на ваш вопрос будет да, InnoDB будет идеальным выбором для набора данных с несколькими миллиардами строк.

Существует множество оптимизаций, которые возможно.

Наиболее очевидной оптимизацией будет установка большого пула буферов, поскольку буферный пул является самым важным, когда дело доходит до InnoDB, потому что InnoDB буферизует данные, а также индекс в пуле буферов. Если у вас есть выделенный сервер MySQL только с таблицами InnoDB, тогда вы должны установить до 80% доступного ОЗУ, которое будет использоваться InnoDB.

Еще одна важная оптимизация - наличие правильных индексов в таблице (с учетом шаблона доступа к данным/обновления), как первичного, так и вторичного. (Помните, что первичные индексы автоматически добавляются к вторичным индексам).

В InnoDB есть некоторые дополнительные лакомства, такие как защита от повреждения данных, автоматическое восстановление и т.д.

Что касается увеличения производительности записи, вы должны настроить файлы журналов транзакций на сумму до 4G.

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

Вы можете повысить производительность, установив формат журнала в строку "row" и установив auto_inc_lock_mode равным 2 (это гарантирует, что innodb не будет удерживать блокировки на уровне таблицы при вставке в столбцы автоматического увеличения).

Если вам нужен какой-либо конкретный совет, вы можете связаться со мной, я был бы более чем готов помочь.

Ответ 2

Оптимизация

  • Будьте осторожны, чтобы не было слишком большого количества индексов. Они дороги при вставке
  • Сделайте ваши типы данных подходящими для ваших данных, как можно плотно приспосабливать их. (так что не стоит сохранять ip-адреса в тексте или блобе, если вы знаете, что я имею в виду). Посмотрите на varchar vs char. Не забывайте, что, поскольку varchar более гибкий, вы торгуете некоторыми вещами. Если вы много знаете о своих данных, это может помочь использовать char, или может быть явно лучше использовать varchars. и др.
  • Вы читаете вообще из этой таблицы? Если это так, вы можете сделать все чтение из реплицированного подчиненного устройства, хотя ваше соединение должно быть достаточно хорошим для этого объема данных.
  • Если у вас большие вставки (кроме количества вставок), убедитесь, что ваш IO на самом деле достаточно быстр, чтобы справиться с нагрузкой.
  • Я не думаю, что есть какая-то причина, по которой MySQL не поддержал бы это. Вещи, которые могут замедлить вас от "тысяч" до "миллионов" до "миллиардов", - это такие вещи, как вышеупомянутые индексы. Существует - насколько я знаю - проблема "mysql полна".
  • Посмотрите на частичные индексы. Из wikipedia (быстрый источник, который я мог найти, не проверял ссылки, но я уверен, что вы можете управлять:)

MySQL с версии 5.4 не поддерживать частичные индексы. [3] В MySQL, термин "частичный индекс" иногда используется для обозначения префиксных индексов, где только усеченный префикс каждого значения хранится в индексе. Это другой метод снижения индекса размер. [4]

Ответ 3

Никакой идеи относительно части MySQL/InnoDB (я бы предположил, что это справится). Но если вы посмотрите на альтернативы, PostgreSQL может управлять БД неограниченного размера на бумаге. (По крайней мере, одна 32-битная база данных существует в соответствии с часто задаваемыми вопросами.)

Можете ли вы сказать мне, какие оптимизации я могу сделать, чтобы ускорить работу?

Ваше перемещение будет зависеть от вашего приложения. Но с миллиардами строк вы, по крайней мере, смотрите на разделение ваших данных, чтобы работать с меньшими таблицами.

В случае PostgreSQL вы также изучите возможность создания частичных индексов.

Ответ 4

Вы можете посмотреть:

http://www.mysqlperformanceblog.com/2006/06/09/why-mysql-could-be-slow-with-large-tables/

http://forums.whirlpool.net.au/archive/954126

Если у вас очень большая таблица (миллиарды записей) и вам нужны данные для таблицы (запросы, которые читают много данных), mysql может замедлить сканирование. Большие базы данных (200 + GB) хороши, но они связаны таблицей IO/temp на диск и несколькими другими проблемами при попытке чтения больших групп, которые не помещаются в память.