2013-05-11 5 views
1

Я пытаюсь создать базу данных, которая будет содержать большое количество записей, каждая с большим количеством столбцов (полей) - может быть, около 200-300 полей для всех таблиц. Предположим, что через несколько лет я заработал около 40.000.000 до 60.000.000 записей.Производительность MySQL с большим количеством записей - разбиение?

Я планирую нормализовать базу данных, поэтому у меня будет много таблиц (около 30-40) -> и много объединений для запросов. База данных будет строго связана с США, а это значит, что запросы будут основываться только на 50 состояниях (если запрос сделан, он не позволит искать/вставлять/etc в несколько состояний, но только один).

Что я могу сделать, чтобы иметь лучшую производительность?

Кто-то пришел с идеей иметь все состояния в разных структурах таблиц, то есть у меня будет 50 таблиц * 30-40 для данных (около 200 таблиц)! Должен ли я даже рассмотреть такой подход?

Следующая идея состояла в том, чтобы использовать разбиение на основе состояний США 50. Как насчет этого?

Любой другой способ?

+0

Используйте разметку, подумайте еще о 200 полях в таблице, это определенно должно быть нормализовано. – rMX

+0

@rMX, я читал, что 200-300 столбцов более 30-40 таблиц, поэтому в среднем 5-10 столбцов на таблицу. –

ответ

2

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

Если вы хотите использовать разделение, this can be a great optimization, если схема разбиения поддерживает запросы, которые необходимо оптимизировать. Например, вы можете разделить на американское государство, и это поможет запросам в отношении данных для определенного состояния. MySQL поддерживает «обрезку разделов», так что запрос будет работать только против определенного раздела, но только в том случае, если в вашем запросе указано определенное значение для столбца, который вы использовали в качестве ключа раздела.

Вы всегда можете проверить, является ли раздел обрезка эффективна с помощью EXPLAIN ПЕРЕГОРОДКИ:

EXPLAIN PARTITIONS 
SELECT ... FROM MyTable WHERE state = 'NY'; 

Это должно сообщить, что запрос использует один раздел.

Если вам нужно, например, запускать запросы по дате, то разделение не помогло бы; MySQL должен будет повторить запрос для всех 50 разделов.

EXPLAIN PARTITIONS 
SELECT ... FROM MyTable WHERE date > '2013-05-01'; 

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

Итак, выберите ключ раздела с учетом запросов.

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


Re вашего комментария:

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

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

+0

Что произойдет, если я вообще не буду использовать разделы? Оставляя столы, поскольку они для 40 миллионов записей, были бы беспорядком производительности? Можете ли вы дать мне несколько других идей о том, как правильно проектировать для производительности? – Cristian

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