Совет по разделению MY SQL

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

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

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


person M2je    schedule 24.04.2015    source источник
comment
Вы сравнивали? Это довольно большой шаг, который не нужен, вероятно, в 99,9% случаев использования.   -  person ceejayoz    schedule 24.04.2015
comment
Я делаю некоторые бенчмаркинги и в основном сосредоточен на распределении данных, и я вижу, что хэш и линейный хэш такие же тихие, как и распределение данных, но с точки зрения производительности кажется, что хеш-аут выполняет все остальные.   -  person M2je    schedule 24.04.2015
comment
Что вы пишете? Это данные журнала, основанные на времени, для каждого пользователя или они изменяются на данные одного пользователя?   -  person Andreas Wederbrand    schedule 24.04.2015
comment
В основном это таблица метаданных почты, которая используется для хранения информации о почте пользователя (а не тела сообщения). Таблица почти одинаково загружена чтением/записью, так как новая почта постоянно поступает, почта удаляется и метаданные почты обновляются (прочитано/непрочитано/помечено/и т. д.), в то время как пользователи просматривают свои почтовые ящики или используют метаданные для отправляйте ответы IMAP перед загрузкой физических сообщений. Система будет поддерживать миллионы пользователей, поэтому мы используем как стратегию сегментирования, так и стратегию разделения.   -  person M2je    schedule 24.04.2015
comment
Разве я не дал вам отрицательный ответ на каком-то другом форуме?   -  person Rick James    schedule 26.04.2015
comment
forums.mysql.com/read.php?106,630625,630633   -  person Rick James    schedule 26.04.2015
comment
@RickJames Я разместил дополнительную информацию на форуме My SQL форумах. mysql.com/read.php?106,630625,630682#msg-630682   -  person M2je    schedule 27.04.2015
comment
Спасибо, Рик, я и Дрю смотрим на то, что вы сказали, и скоро вернемся к вам.   -  person M2je    schedule 28.04.2015
comment
(ничего с 28 апреля)   -  person Rick James    schedule 14.06.2015
comment
@RickJames Я обновил вопрос форума forums.mysql.com/read .php?106,630625,631998#msg-631998 Буду рад услышать ваши идеи о том, что мы решили сделать.   -  person M2je    schedule 16.06.2015


Ответы (1)


Итак, для тех, кому может быть интересна эта тема, вот мой опыт:

В конце концов мы решили не использовать порционирование MYSQL, а вместо этого использовать сегментирование базы данных. Причина этого: независимо от того, насколько хорошо вы реализуете порционирование, все равно существует тот факт, что данные необходимо индексировать и помещать в память, когда это необходимо, и для нашей системы, которая обрабатывает до 500 000 электронных писем пользователей, это может просто стать основным оборудованием. проблема со временем, как люди получат почту и заставит вас покупать более дорогое оборудование.

Также в MYSQL есть еще одна скрытая стоимость, которая заключается в изменении схемы таблиц, что может просто стать невозможным, если у вас большая таблица и ограниченные ресурсы. После использования MSSQL и Oracle в реальном сценарии меня НЕ впечатлило то, как MYSQL обрабатывает обновления и индексацию метаданных.

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

Хотя я должен сказать, что если вы создадите хороший индекс для своей системы (будьте очень осторожны с первичными ключами, потому что это ваш кластеризованный индекс в MYSQL, и ваши запросы будут намного эффективнее, если вы запрашиваете индекс первичного ключа), вам может не понадобиться порционирование вообще (прямо сейчас на одной из наших установок у нас есть таблица с +450 000 000 записей, и это очень быстро, когда вы используете индекс первичного ключа для запроса данных)

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

Надеюсь, это поможет вам принять правильное решение.

person M2je    schedule 30.10.2015