2012-08-28 4 views
3

Я новичок в sharding и хотел знать, какие последствия для sharding для разных запросов. Для набора образцов данных с именем «люди»:Каковы последствия скальпинга?

person_id | person_fname | person_lname | person_dob 
---------------------------------------------------- 
1   | John   | Smith  | 1972-03-04 
2   | Sally  | Jones  | 1968-09-14 
3   | Phil   | Forrester | 1976-11-25 
4   | Gwen   | Langley  | 1955-04-20 
5   | Pedro  | Romero  | 1962-12-21 
6   | Gene   | Halford  | 1978-01-11 
7   | Juan   | Peza   | 1977-08-07 
8   | Pierre  | Henry  | 1980-04-30 

Данные sharded поровну между четырьмя узлами путем создания хэша суррогатной идентичностью «ID». Тем не менее, вы должны выполнять операции чтения и записи на пластинках, которые потенциально охватывают все узлы, такие как:

SELECT person_fname, 
     person_lname 
FROM people 
WHERE person_dob > '1970-01-01' 

Или говорят, что у вас еще таблицы «заказы», ​​который ссылается на «народ» на «person_id» столбец и хотел выполнить объединение ...

SELECT order_id, 
      order_amount, 
      order_date, 
      person_fname, 
      person_lname 
FROM  orders 
LEFT JOIN people 
WHERE  order_amount > 50 

ли так, что в действительности все узлы будут запускать запрос параллельно? Я предполагаю, что каждый сервер будет иметь меньше работы для каждого шага, так как вместо одного экземпляра, выполняющего запрос по восьми записям, одновременно четыре экземпляра будут запускать запрос по двум (иш) записям, с дальнейшим преимуществом, которое, если СУБД может выполнять выбор осколков, тогда другие узлы не должны продолжать выполнять какие-либо дополнительные инструкции, верно ли это предположение?

Есть ли какие-либо известные последствия для работы с осколками и сложными соединениями (помимо этого простого примера)?

ответ

2

Это действительно позволит сделать это параллельно.

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

Однако, если у вас есть, например, несколько человек. orders так, что все строки в таблице orders, где в том же осколке, что и соответствующая строка в таблице people, не возникает.

Вам необходимо разработать свой подход к осколкам, чтобы у вас было много таких случаев, и несколько (в идеале нет), где вы заканчиваете пересечение осколков.

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

+0

Спасибо, что имеет смысл –

+0

К сожалению, вышеприведенное относится к категории «легче сказать, чем сделать». –

1

Да, осколки означают серьезные изменения в работе. Он никогда не позволяет оставить приложение без изменений.

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

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

+0

Извините, я не совсем последовал: «Это никогда не позволяет оставить приложение неизменным», что вы подразумеваете под этим? –

+2

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

+0

А так, если вы решите выйти из нечеткого, вы, скорее всего, захотите изменить способ работы вашего приложения, чтобы избежать подводных камней? Нет ли преимуществ в производительности, связанных с возможностью параллелизации запроса на нескольких узлах, или типично, что добавленная сложность рабочей нагрузки отрицает это? –

0

Отказ от ответственности: Я работаю для ScaleBase, создателя полного масштабируемого решения, «автоматической ошпаривающей машины», если хотите, выглядит и чувствует себя как 1 MySQL, прокси-сервер в сетку «осколков», автоматизацию маршрутизации команд и распараллеливание запросов cross-db и объединение результатов - вы не увидите разницы с результатом, полученным от 1 DB. ORDER, GROUP, LIMIT, agg поддерживаются!Маршрутизация и распараллеливание выполняются внутри «контроллера» в соответствии с командой и параметрами.

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

Примеры запросов - это классические примеры выполнения «all-db», которые, безусловно, будут работать быстрее, если они распределены и распараллелены. Индексы более эффективны, используется ОЗУ и т. Д.

Надеюсь, я помог.

+0

Спасибо, Doron, как он сравнивается с настройкой автоматической настройки MySQL Cluster? –

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