Создание большой таблицы в MySQL - PullRequest
1 голос
/ 11 августа 2009

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

На что нужно обратить внимание при создании базы данных?

Нужна ли специальная версия MySQL? Должен ли я использовать MyISAM или InnoDB?

Ответы [ 3 ]

4 голосов
/ 11 августа 2009

Для начала вам может потребоваться сделать шаг назад и пересмотреть свою схему. Как вы получили 10 миллионов строк в таблице участников? У вас действительно есть 10 миллионов участников (кажется, много)?

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

Если у вас есть 10 миллионов участников, я бы посоветовал вам начать с того, чтобы ваше приложение не зависело от поставщика (то есть стандартного SQL). Затем, если вы начнете сталкиваться с проблемами, просто выбросите вашу текущую СУБД и замените ее более мощной.

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

Кстати, 10 миллионов строк на самом деле не считается большой таблицей базы данных, по крайней мере, откуда я.

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

  • Дизайн ваших столов для 3NF всегда. Как только вы выявите проблемы с производительностью, вы можете нарушить это правило, если понимаете последствия.
  • Не беспокойтесь о настройке производительности во время разработки, ваши запросы постоянно меняются. Просто примите тот факт, что они могут не бежать быстро.
  • Как только большинство запросов заблокированы, затем начинают настраивать ваши таблицы. Добавьте любые индексы, ускоряющие выборки, отмену нормализации и т. Д.
  • Настройка - , а не - операция установки и забывания (вот почему мы так много платим нашим администраторам баз данных). Постоянно следите за производительностью и настраивайте под себя.
  • Я предпочитаю придерживаться своего стандарта SQL, чтобы сохранить возможность переключения поставщиков в любое время. Но я прагматичный. Используйте специфичные для продавца вещи, если они действительно дают вам импульс. Просто будьте в курсе того, что вы теряете, и постарайтесь как можно больше изолировать вещи, специфичные для поставщика.
  • Люди, которые используют "select * from ...", когда им не нужен каждый столбец, должны быть избиты в подчинение.
  • Аналогично тем, которые выбирают каждую строку для фильтрации на стороне клиента. Люди, которые пишут наши СУБД, не сидят весь день, играя в Пасьянс, они знают , как заставить запросы выполняться быстро. Позвольте базе данных делать то, что лучше всего. Фильтрация и агрегация лучше всего выполняются на стороне сервера - отправляйте только то, что нужно по сети.
  • Создайте свои запросы, чтобы быть полезными. Кроме Министерства обороны, которому требуются отчеты с подробным описанием каждого компонента их авианосцев вплоть до уровня «гайки и болты», никто не заинтересован в чтении вашего 1200-страничного отчета, независимо от того, насколько полезным он, по вашему мнению, может быть. На самом деле, я не думаю, что министерство обороны тоже читает их, но я бы не хотел, чтобы какой-то генерал жевал меня, потому что я не делал этого - эти парни могут быть громкими , и у них есть немало сложное оружие под их контролем.
0 голосов
/ 11 августа 2009

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

Для запросов убедитесь, что вы строите умные индексы для соответствия вашему запросу. Например, если вы хотите сортировать по столбцам c и выбирать на основе столбцов a и b, убедитесь, что у вас есть индекс, который охватывает столбцы a, b и c в указанном порядке, и этот индекс включает полную длину каждого столбца , а не префикс. Если вы не сделаете свой индекс правильно, сортировка по большому количеству данных убьет вас. Смотри http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html

Просто заметка об InnoDB, настройке и тестировании с ним большой таблицы. Если вы начнете вводить свои данные, это займет несколько часов. Убедитесь, что вы периодически делаете коммиты, в противном случае, если вы хотите остановить и повторить по какой-либо причине, вам в конечном итоге придется: 1) подождать несколько часов для восстановления транзакции или 2) убить mysqld, установить для флага восстановления InnoDB значение no recovery и перезапустить. Также, если вы хотите повторно внедрить данные с нуля, УДАЛИТЕ таблицу и пересоздаете ее практически мгновенно, но на самом деле «УДАЛИТЬ ИЗ ТАБЛИЦЫ» займет несколько часов.

0 голосов
/ 11 августа 2009

Хотя бы используйте InnoDB. Вы почувствуете боль, когда поймете, что MyISAM только что потерял ваши данные ...

Кроме того, вы должны предоставить больше информации о том, что вы хотите сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...