sql >> Database teknologi >  >> RDS >> MariaDB

Database Design 101:Partitioner i MySQL

I dette blogindlæg vil vi diskutere en af ​​de mest udbredte funktioner i MySQL - partitioner.

Hvad er partitionering?

I MySQL er partitionering en databasedesignteknik, hvor en database opdeler data i flere tabeller, men stadig behandler dataene som en enkelt tabel af SQL-laget. Kort sagt, når du partitionerer en tabel, opdeler du den i flere undertabeller:partitionering bruges, fordi det forbedrer ydeevnen af ​​visse forespørgsler ved kun at tillade dem at få adgang til en del af dataene, hvilket gør dem hurtigere. I/O-operationer kan også forbedres, fordi data og indekser kan opdeles på tværs af mange diskenheder.

Der er to typer partitionering:vandret og lodret. Horisontal partitionering involverer at sætte forskellige rækker i forskellige tabeller, lodret partitionering involverer på den anden side at skabe tabeller med færre kolonner og bruge yderligere tabeller til at gemme de resterende kolonner.

Hvordan fungerer partitionering?

  • Når SELECT-forespørgsler bruges, åbner partitioneringslaget og låser partitioner, forespørgselsoptimeringsværktøjet bestemmer, om nogen af ​​partitionerne kan beskæres, derefter videresender partitioneringslaget behandler-API-kaldene til den storage-motor, der håndterer partitionerne.
  • Når INSERT-forespørgsler bruges, åbner og låser partitioneringslaget partitioner, bestemmer hvilken partition rækken skal tilhøre, og videresender derefter rækken til den partition.
  • Når DELETE-forespørgsler bruges, åbner partitioneringslaget og låser partitioner, bestemmer hvilken partition, der indeholder rækken, og sletter derefter rækken fra den partition.
  • Når der bruges UPDATE-forespørgsler, åbner og låser partitioneringslaget partitioner, finder ud af hvilken partition der indeholder rækken, henter rækken og ændrer den, bestemmer derefter hvilken partition der skal indeholde den nye række, videresender rækken til den nye partition med en indsættelsesanmodning, og videresender derefter sletteanmodningen til den originale partition.

Hvornår skal du bruge partitionering?

Generelt er partitionering nyttig, når:

  • Du har en masse data, som du skal søge igennem.
  • Dine borde er for store til at passe i hukommelsen.
  • Dine tabeller indeholder historiske data, og nye data tilføjes til den nyeste partition.
  • Du tror, ​​at du bliver nødt til at distribuere indholdet af en tabel på tværs af forskellige lagerenheder.
  • Du tror, ​​du bliver nødt til at gendanne individuelle partitioner.

Hvis et eller flere af scenarierne beskrevet ovenfor beskriver din situation, kan partitionering hjælpe. Før du partitionerer dine data, skal du dog huske på, at MySQL-partitioner har deres egne begrænsninger:

  • Partitioneringsudtryk tillader ikke brug af lagrede procedurer, lagrede funktioner, brugerdefinerede funktioner (UDF'er) eller plugins og med begrænset understøttelse af SQL-funktioner. Du kan heller ikke bruge deklarerede eller lagrede variabler.
  • Partitionerede tabeller kan ikke indeholde eller refereres til af fremmednøgler.
  • Der er en grænse på 1.024 partitioner pr. tabel (fra MariaDB 10.0.4 kan tabeller maksimalt indeholde 8.192 partitioner).
  • En tabel kan kun partitioneres, hvis lagermotoren understøtter partitionering.
  • Forespørgselscachen er ikke opmærksom på partitionering eller partitionsbeskæring.
  • Alle partitioner skal bruge den samme lagermaskine.
  • FullTEXT-indekser understøttes ikke
  • Midlertidige tabeller kan ikke partitioneres

Indstillingerne ovenfor bør hjælpe dig med at beslutte, om partitionering er en mulighed for dig eller ej.

Partitioneringstyper

Hvis du beslutter dig for at bruge partitioner, skal du huske, at du har en række partitioneringstyper at vælge imellem. Vi vil kort dække dine muligheder nedenfor og dykke dybere ned i dem:

  • Partitionering efter RANGE kan hjælpe dig med at opdele rækker baseret på kolonneværdier, der falder inden for et givet område.
  • Partitionering efter LIST kan hjælpe dig med at opdele rækker baseret på medlemskabet af kolonneværdier på en given liste.
  • Partitionering af HASH kan hjælpe dig med at opdele rækker baseret på en værdi, der returneres af et brugerdefineret udtryk.
  • Partitionering af KEY kan hjælpe dig med at partitionere rækker baseret på en hashfunktion leveret af MySQL.

Partitionering efter RANGE

Partitionering efter RANGE er en af ​​de mest populære former for partitionering af MySQL-tabeller. Når du opdeler en tabel efter RANGE, partitionerer du tabellen på en sådan måde, at hver partition indeholder et vist antal rækker, der falder inden for et givet område. For at definere en partition, skal du definere navnet på den og derefter fortælle den, hvilke værdier den skal indeholde - for at opdele en tabel efter område, skal du tilføje en PARTITION BY RANGE-sætning. For eksempel, hvis du ønsker at navngive din partition p0 og få den til at indeholde hver værdi, der er mindre end 5, skal du sørge for, at din forespørgsel indeholder PARTITION p0-VÆRDIER MINDRE END (5). Her er et eksempel på en opdelt tabel:

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),

...

);

Du kan også definere en partition, der indeholder alle de værdier, der ikke falder inden for bestemte områder som f.eks.:

PARTITION p5 VALUES LESS THAN MAXVALUE

Ovenstående partition er navngivet p5, og den har alle værdier, som andre partitioner ikke gør - MAXVALUE repræsenterer en værdi, der altid er højere end den størst mulige værdi. Du kan også bruge funktioner ved at definere dine partitioner som sådan:

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

);

I dette tilfælde gemmes alle værdier, der er mindre end 2000 i partitionen p0, alle værdier, der er mindre end 2010, gemmes i partitionen p1, alle værdier, der er mindre end 2020, er gemt i partitionen p2 og alle værdier, der ikke falder inden for nogen af ​​disse områder, gemmes i partitionen p3.

Partitionering efter LIST

Partitionering af MySQL-tabeller efter LIST svarer til partitionering efter RANGE - den største forskel ved at partitionere tabeller efter LIST er, at når tabeller er opdelt efter LIST, er hver partition defineret og valgt baseret på medlemskabet af en kolonneværdi i et sæt værdilister i stedet for en række værdier. Partitionering efter LIST kan være nyttig, når du ved, at du for eksempel har data, der kan opdeles i flere mindre sæt data (f.eks. regioner). Antag, at du har en butik, der har 4 franchises:en i den centrale del af byen, anden i nord, tredje i øst, fjerde i vest. Du kan partitionere en tabel på en sådan måde, at data, der tilhører en bestemt franchise, vil blive gemt i en partition dedikeret til denne franchise:

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)

);

Partitionering med HASH

Partitionering af MySQL-tabeller med HASH kan være en måde at sikre, at data på tværs af partitioner er jævnt fordelt. Hvis du partitionerer dine tabeller med HASH, behøver du kun at angive, hvor mange partitioner du skal have dine data opdelt i - resten tages af MySQL. Du kan bruge partitionering med HASH ved at tilføje følgende sætning til CREATE TABLE:

PARTITION BY HASH(id)

PARTITIONS 5;

Erstat 5 med tallet, der specificerer i, hvor mange partitioner du skal have dine data opdelt i - standardtallet er 1.

MySQL understøtter også partitionering med LINEÆR HASH - lineær hashing adskiller sig fra almindelig hashing, fordi lineær hashing bruger en lineær algoritme med to potenser. For at opdele tabeller med en LINEÆR HASH skal du erstatte PARTITION BY HASH med PARTITION BY LINEAR HASH.

Partitionering med KEY

Partitionering af MySQL-tabeller med KEY svarer til at partitionere MySQL-tabeller med HASH - i dette tilfælde leveres hashing-funktionen til nøglepartitionering af MySQL-serveren. Alle kolonner, der bruges som partitioneringsnøgle, skal omfatte hele tabellens primære nøgle eller i det mindste være en del af tabellens primære nøgle. Hvis der ikke er angivet et kolonnenavn som partitioneringsnøglen, vil den primære nøgle blive brugt. Hvis der ikke er en primær nøgle, men der er en unik nøgle, vil den unikke nøgle blive brugt i stedet. For eksempel er følgende sætninger begge gyldige, selvom den første sætning ikke engang angiver partitioneringsnøglen:

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;

Konklusion

For at opsummere kan partitioner være nyttige, hvis du har mange data, dine tabeller er for store til at passe i hukommelsen, eller de indeholder historiske data. Partitioner kan også være nyttige, hvis du mener, at du bliver nødt til at distribuere indholdet af en tabel på tværs af forskellige lagermedier, også hvis du vil have mulighed for at slette eller gendanne individuelle partitioner.

Du skal dog huske på, at partitioner i MySQL har deres egne ulemper. En af de store ulemper ved partitionering er, at det vil gøre dine borde større - du kan ikke få fart uden at gå på kompromis med pladsen. Hvis du har et meget stort sæt data, kan dette være et ret stort problem.


  1. Få de underliggende kolonner i en visning baseret på dens resultatsæt

  2. Online skemaopgradering i MySQL Galera Cluster ved hjælp af RSU-metoden

  3. Sådan fjerner du en del af strengen i oracle

  4. Introduktion til PL/SQL-funktioner i Oracle-databasen