Производительность MySQL с большим количеством записей - разделение?

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

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

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

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

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

Любым другим путем?


person Cristian    schedule 11.05.2013    source источник
comment
Используйте партиционирование, подумайте еще раз о 200 полях в таблице, это обязательно должно быть нормализовано.   -  person rMX    schedule 11.05.2013
comment
@rMX, я читал, что 200-300 столбцов в 30-40 таблицах, то есть в среднем 5-10 столбцов на таблицу.   -  person Bill Karwin    schedule 11.05.2013


Ответы (1)


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

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

Вы всегда можете проверить, эффективно ли удаление разделов, используя EXPLAIN PARTITIONS:

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

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

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

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

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

Так что выбирайте ключ секции с учетом запросов.

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


Повторите ваш комментарий:

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

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

person Bill Karwin    schedule 11.05.2013
comment
Что произойдет, если я вообще не буду использовать разделы? Если оставить таблицы такими, какие они есть, для 40 миллионов записей, будет беспорядок с производительностью? Можете ли вы дать мне другие идеи о том, как правильно проектировать для повышения производительности? - person Cristian; 11.05.2013