MariaDB
 sql >> база данни >  >> RDS >> MariaDB

Проектиране на база данни 101:Дялове в MySQL

В тази публикация в блога ще обсъдим една от най-широко използваните функции на MySQL – дяловете.

Какво е разделяне?

В MySQL разделянето е техника за проектиране на база данни, при която база данни разделя данните на множество таблици, но въпреки това третира данните като една таблица от SQL слоя. Просто казано, когато разделяте таблица, вие я разделяте на множество подтаблици:разделянето се използва, защото подобрява производителността на определени заявки, като им позволява достъп само до част от данните, като по този начин ги прави по-бързи. I/O операциите също могат да бъдат подобрени, тъй като данните и индексите могат да бъдат разделени на много дискови томове.

Има два вида разделяне:хоризонтално и вертикално. Хоризонталното разделяне включва поставяне на различни редове в различни таблици, вертикалното, от друга страна, включва създаване на таблици с по-малко колони и използване на допълнителни таблици за съхраняване на останалите колони.

Как работи разделянето?

  • Когато се използват заявки SELECT, разделящият слой отваря и заключва дялове, оптимизаторът на заявки определя дали някой от дяловете може да бъде съкратен, след това слоят за разделяне препраща извикванията на API на манипулатора към машината за съхранение, която обработва дяловете.
  • Когато се използват заявки INSERT, разделящият слой отваря и заключва дяловете, определя към кой дял трябва да принадлежи редът, след което препраща реда към този дял.
  • Когато се използват заявки DELETE, разделящият слой се отваря и заключва дяловете, определя кой дял съдържа реда, след което изтрива реда от този дял.
  • Когато се използват заявки UPDATE, разделящият слой отваря и заключва дялове, установява кой дял съдържа реда, извлича реда и го модифицира, след което определя кой дял трябва да съдържа новия ред, препраща реда към новия дял със заявка за вмъкване, след което препраща заявката за изтриване към оригиналния дял.

Кога трябва да използвате разделяне?

По принцип разделянето на дялове е полезно, когато:

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

Ако един или повече от описаните по-горе сценарии описват вашата ситуация, разделянето може да помогне. Преди да разделите данните си обаче, имайте предвид, че MySQL дяловете имат свои собствени ограничения:

  • Изразите за разделяне не позволяват използването на съхранени процедури, съхранени функции, потребителски дефинирани функции (UDF) или плъгини и с ограничена поддръжка за SQL функции. Не можете също да използвате декларирани или съхранени променливи.
  • Разделените таблици не могат да съдържат или препращат към външни ключове.
  • Има ограничение от 1024 дяла на таблица (започвайки от MariaDB 10.0.4, таблиците могат да съдържат максимум 8192 дяла).
  • Таблица може да бъде разделена само ако механизмът за съхранение поддържа разделяне.
  • Кешът на заявката не знае за разделяне или подрязване на дял.
  • Всички дялове трябва да използват една и съща машина за съхранение.
  • FullTEXT индексите не се поддържат
  • Временните таблици не могат да бъдат разделени

Опциите по-горе трябва да ви помогнат да решите дали разделянето е опция за вас или не.

Типове на дялове

Ако решите да използвате дялове, имайте предвид, че имате няколко типа дялове, от които да избирате. Ще разгледаме накратко вашите опции по-долу, след което ще се потопим по-дълбоко в тях:

  • Разделянето по RANGE може да ви помогне да разделите редове въз основа на стойности на колони, попадащи в даден диапазон.
  • Разделянето по LIST може да ви помогне да разделите редове въз основа на принадлежността на стойностите на колоните в даден списък.
  • Разделянето чрез HASH може да ви помогне да разделите редове въз основа на стойност, върната от дефиниран от потребителя израз.
  • Разделянето по KEY може да ви помогне да разделите редове въз основа на функция за хеширане, предоставена от MySQL.

Разделяне по RANGE

Разделянето по RANGE е една от най-популярните форми на разделяне на MySQL таблици. Когато разделяте таблица по RANGE, вие разделяте таблицата по такъв начин, че всеки дял съдържа определен брой редове, които попадат в даден диапазон. За да дефинирате дял, дефинирайте името му, след което му кажете кои стойности трябва да съдържа - за да разделите таблица по диапазон, добавете израз PARTITION BY RANGE. Например, ако искате да наименувате своя дял p0 и да го накарате да задържа всяка стойност, която е по-малка от 5, ще трябва да се уверите, че вашата заявка съдържа PARTITION p0 СТОЙНОСТИ ПО-МАЛКИ ОТ (5). Ето пример за разделена таблица:

CREATE TABLE sample_table (

id INT(255) NOT NULL AUTO_INCREMENT PRIMARY KEY,

column_name VARCHAR(255) NOT NULL DEFAULT ‘’

...

) PARTITION BY RANGE (column_name) (

PARTITION p0 VALUES LESS THAN (5),

PARTITION p1 VALUES LESS THAN (10),

PARTITION p2 VALUES LESS THAN (15),

PARTITION p3 VALUES LESS THAN (20),

...

);

Можете също да дефинирате дял, който съдържа всички стойности, които не попадат в определени диапазони, както следва:

PARTITION p5 VALUES LESS THAN MAXVALUE

Горещият дял се нарича p5 и съдържа всички стойности, които другите дялове нямат - MAXVALUE представлява стойност, която винаги е по-висока от най-голямата възможна стойност. Можете също да използвате функции, като дефинирате вашите дялове по следния начин:

PARTITION BY RANGE (YEAR(date)) (

    PARTITION p0 VALUES LESS THAN (2000),

    PARTITION p1 VALUES LESS THAN (2010),

    PARTITION p2 VALUES LESS THAN (2020),

    PARTITION p3 VALUES LESS THAN MAXVALUE

);

В този случай всички стойности, които са по-малки от 2000, се съхраняват в дяла p0, всички стойности, които са по-малки от 2010, се съхраняват в дяла p1, всички стойности, които са по-малки от 2020 се съхраняват в дялът p2 и всички стойности, които не попадат в нито един от тези диапазони, се съхраняват в дяла p3.

Разделяне по СПИСЪК

Разделянето на MySQL таблици по LIST е подобно на разделянето по RANGE - основната разлика при разделянето на таблици по LIST е, че когато таблиците са разделени от LIST, всеки дял се дефинира и избира въз основа на принадлежността към стойност на колона в набор от списъци със стойности, а не в диапазон от стойности. Разделянето по LIST може да бъде полезно, когато знаете, че например имате данни, които могат да бъдат разделени на множество по-малки набори от данни (да речем, региони). Да предположим, че имате магазин, който има 4 франчайза:един в централната част на града, втори на север, трети на изток, четвърти на запад. Можете да разделите таблица по такъв начин, че данните, принадлежащи към определен франчайз, да се съхраняват в дял, посветен на този франчайз:

PARTITION BY LIST(store) (

PARTITION central VALUES IN (1,3,5),

PARTITION north VALUES IN (2,4,7),

PARTITION east VALUES IN (8,9),

PARTITION west VALUES IN (10,11)

);

Разделяне по HASH

Разделянето на MySQL таблици чрез HASH може да бъде начин да се гарантира, че данните между дяловете се разпределят равномерно. Ако разделяте таблиците си по HASH, трябва само да посочите на колко дяла трябва да бъдат разделени вашите данни - останалото се поема от MySQL. Можете да използвате разделяне чрез HASH, като добавите следния израз към CREATE TABLE:

PARTITION BY HASH(id)

PARTITIONS 5;

Заменете 5 с числото, което указва на колко дяла трябва да бъдат разделени вашите данни - номерът по подразбиране е 1.

MySQL също така поддържа разделяне чрез ЛИНЕЕН ХЕШ ​​- линейното хеширане се различава от редовното хеширане, тъй като линейното хеширане използва линеен алгоритъм за степен на две. За да разделите таблиците по ЛИНЕЕН ХЕШ, заменете PARTITION BY HASH с PARTITION BY LINEAR HASH.

Разделяне по КЛЮЧ

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

CREATE TABLE demo_table (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL DEFAULT ''
)
PARTITION BY KEY()
PARTITIONS 2;
CREATE TABLE demo_table (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
)
PARTITION BY KEY(id)
PARTITIONS 5;

Заключение

За да обобщим, дяловете могат да бъдат полезни, ако имате много данни, вашите таблици са твърде големи, за да се поберат в паметта или съдържат исторически данни. Разделите също могат да бъдат полезни, ако смятате, че ще трябва да разпределите съдържанието на таблица между различни носители за съхранение, също и ако искате да имате опцията за изтриване или възстановяване на отделни дялове.

Все пак, имайте предвид, че дяловете в MySQL имат своите недостатъци. Един от основните недостатъци на разделянето е, че то ще направи вашите таблици по-големи - не можете да постигнете скорост, без да правите компромис с пространството. Ако имате много голям набор от данни, това може да бъде доста голям проблем.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MariaDB FLOOR() срещу TRUNCATE()

  2. Инсталирайте WordPress с Nginx, MariaDB 10 и PHP 7 на Debian 9

  3. Как да инсталирате, защитите и настроите производителността на сървъра на базата данни MariaDB

  4. Внедряване на MySQL Galera Cluster 4.0 в Amazon AWS EC2

  5. Въведение в внедряването на MySQL с помощта на Ansible роля