Лучший подход для ограждения таблиц MySQL - не делать этого, если это совершенно не неизбежно.
Когда вы пишете приложение, вы обычно хотите сделать это таким образом, чтобы максимизировать скорость, разработчикскорость.Вы оптимизируете время ожидания (время, пока ответ не будет готов) или пропускную способность (количество ответов за единицу времени) только при необходимости.
Вы разбиваете, а затем назначаете разделы различным хостам (= осколок) только тогда, когда суммавсе эти разделы больше не помещаются в один экземпляр сервера базы данных - причина того, что они либо пишут, либо читают.
Случай записи: а) частота записи постоянно перегружает диски этого сервера или б)происходит слишком много операций записи, поэтому репликация постоянно отстает в этой иерархии репликации.
Случай чтения для шардинга - это когда размер данных настолько велик, что его рабочий набор больше не помещается в память ичтение данных начинает попадать на диск, а не обслуживаться из памяти большую часть времени.
Только тогда, когда у вас есть , чтобы сделать это осколком.
Моментвы осколок, вы платите за это несколькими способами:
Большая часть вашего SQL больше не декларируетсяrative.
Обычно в SQL вы сообщаете базе данных, какие данные вам нужны, и оставляете это оптимизатору, чтобы превратить эту спецификацию в программу доступа к данным.Это хорошо, потому что это гибко, и потому что написание этих программ доступа к данным - скучная работа, которая вредит скорости.
В изолированной среде вы, вероятно, присоединяетесь к таблице на узле A с данными на узле B,или у вас есть таблица, большая, чем узел, на узлах A и B, и вы соединяете данные из нее с данными, находящимися на узлах B и C. Вы начинаете писать разрешения соединения на основе хеширования на стороне приложения вручную, чтобы разрешить это (или вы заново изобретаете кластер MySQL), то есть вы получаете много SQL, который больше не декларативен, а выражает функциональность SQL процедурным способом (например, вы используете операторы SELECT в циклах).
большая задержка в сети.
Обычно запрос SQL может быть разрешен локально, и оптимизатор знает о затратах, связанных с доступом к локальному диску, и разрешает запрос таким образом, чтобы минимизировать затраты для этого.
В изолированной среде запросы разрешаются либодоступ к значению ключа unning по сети к нескольким узлам (возможно, с помощью пакетного доступа к ключу, а не отдельных обращений к ключу за цикл) или путем передачи частей предложения WHERE
вперед к узлам, где они могут быть применены (это называется 'условие pushdown '), или и то, и другое.
Но даже в лучшем случае это включает в себя гораздо больше сетевых обходов, чем локальная ситуация, и это более сложно.Тем более, что оптимизатор MySQL вообще ничего не знает о задержке в сети (хорошо, кластер MySQL постепенно улучшается, но для ванильного MySQL вне кластера это все еще верно).
Вы теряете много выразительногосила SQL.
Хорошо, это, вероятно, менее важно, но ограничения внешнего ключа и другие механизмы SQL для целостности данных не способны охватить несколько сегментов.
В MySQL нет API, который допускает асинхронные запросыто есть в рабочем порядке.
Когда данные одного типа находятся на нескольких узлах (например, пользовательские данные на узлах A, B и C), горизонтальные запросы часто необходимо разрешать для всех этих узлов ("Найтивсе учетные записи пользователей, которые не входили в систему в течение 90 дней и более ").Время доступа к данным растет линейно с количеством узлов, если только несколько узлов не могут быть запрошены параллельно, а результаты агрегированы по мере их поступления («Map-Reduce»).
Предварительным условием для этого является API асинхронной связи, который не существует для MySQL в хорошем рабочем состоянии.Альтернатива - много разветвлений и соединений в дочерних процессах, которые посещают мир suck на сезонном проходе.
Как только вы начинаете сегментирование, структура данных и топология сети становятся видимыми как точки производительностик вашему заявлению.Чтобы работать достаточно хорошо, ваше приложение должно знать об этих вещах, и это означает, что на самом деле имеет смысл только разделение на уровне приложения.
Вопрос больше в том, хотите ли вы автоматически разделять (определять, какая строкапереходит в какой узел, например, путем хеширования первичных ключей) или если вы хотите выполнить функциональное разделение вручную («Таблицы, связанные с пользовательской историей xyz, переходят к этому мастеру, а таблицы abc и def - к этому мастеру»).
Функциональное разбиение имеет то преимущество, что, если все сделано правильно, большую часть времени он невидим для большинства разработчиков, поскольку все таблицы, связанные с его пользовательской историей, будут доступны локально.Это позволяет им как можно дольше пользоваться декларативным SQL, а также будет иметь меньшую задержку в сети, поскольку количество межсетевых передач поддерживается минимальным.
Функциональное разбиение имеет тот недостаток, что оно не позволяетлюбая отдельная таблица должна быть больше одного экземпляра, и она требует ручного внимания дизайнера.
Функциональное разбиение имеет то преимущество, что его относительно легко сделать с существующей кодовой базой с рядом изменений, которые не слишком велики.,http://Booking.com делал это несколько раз в последние годы, и это хорошо сработало для них.
Сказав все это, глядя на ваш вопрос, я верю, что вы спрашиваете неправильновопросы, или я полностью неправильно понимаю вашу проблему.