МОЯТ съвет за разделяне на SQL

В момента решаваме схема за разделяне на таблица в нашата MySQL база данни. Имаме множество сегменти и насочваме всички записи на един потребител към един сегмент. Също така искаме да разделим самата таблица по userid. Ние сме малко нови в разделянето и бихме искали обратна връзка относно това кой тип дял да използваме и колко често вероятно ще трябва да поддържаме дяла.

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

Освен това... планираме да използваме максималния брой дялове (мисля 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