sql >> Databasteknik >  >> RDS >> MariaDB

Databasdesign 101:Partitioner i MySQL

I det här blogginlägget kommer vi att diskutera en av de mest använda funktionerna i MySQL - partitioner.

Vad är partitionering?

I MySQL är partitionering en databasdesignteknik där en databas delar upp data i flera tabeller, men ändå behandlar data som en enda tabell av SQL-lagret. Enkelt uttryckt, när du partitionerar en tabell, delar du upp den i flera undertabeller:partitionering används eftersom det förbättrar prestandan för vissa frågor genom att de bara får tillgång till en del av data, vilket gör dem snabbare. I/O-operationer kan också förbättras eftersom data och index kan delas över många diskvolymer.

Det finns två typer av partitionering:horisontell och vertikal. Horisontell partitionering innebär att olika rader läggs in i olika tabeller, vertikal partitionering å andra sidan innebär att skapa tabeller med färre kolumner och använda ytterligare tabeller för att lagra de återstående kolumnerna.

Hur fungerar partitionering?

  • När SELECT-frågor används öppnas partitioneringsskiktet och låser partitioner, frågeoptimeraren avgör om någon av partitionerna kan beskäras, sedan vidarebefordrar partitioneringsskiktet hanterarens API-anrop till lagringsmotorn som hanterar partitionerna.
  • När INSERT-frågor används öppnas och låser partitioneringsskiktet partitioner, bestämmer vilken partition raden ska tillhöra och vidarebefordrar sedan raden till den partitionen.
  • När DELETE-frågor används öppnas partitioneringsskiktet och låser partitioner, bestämmer vilken partition som innehåller raden och tar sedan bort raden från den partitionen.
  • När UPDATE-frågor används öppnas och låser partitioneringsskiktet partitioner, tar reda på vilken partition som innehåller raden, hämtar raden och modifierar den, bestämmer sedan vilken partition som ska innehålla den nya raden, vidarebefordrar raden till den nya partitionen med en insättningsbegäran och vidarebefordrar sedan borttagningsbegäran till den ursprungliga partitionen.

När ska du använda partitionering?

I allmänhet är partitionering användbar när:

  • Du har mycket data som du behöver söka igenom.
  • Dina tabeller är för stora för att få plats i minnet.
  • Dina tabeller innehåller historisk data och ny data läggs till i den senaste partitionen.
  • Du tror att du kommer att behöva distribuera innehållet i en tabell över olika lagringsenheter.
  • Du tror att du kommer att behöva återställa enskilda partitioner.

Om ett eller flera av scenarierna som beskrivs ovan beskriver din situation, kan partitionering hjälpa. Innan du partitionerar dina data, kom dock ihåg att MySQL-partitioner har sina egna begränsningar:

  • Partitioneringsuttryck tillåter inte användning av lagrade procedurer, lagrade funktioner, användardefinierade funktioner (UDF) eller plugins, och med begränsat stöd för SQL-funktioner. Du kan inte heller använda deklarerade eller lagrade variabler.
  • Partitionerade tabeller kan inte innehålla eller refereras till av främmande nycklar.
  • Det finns en gräns på 1 024 partitioner per tabell (från MariaDB 10.0.4 kan tabeller innehålla maximalt 8 192 partitioner).
  • En tabell kan endast partitioneras om lagringsmotorn stöder partitionering.
  • Frågecachen känner inte till partitionering eller partitionsbeskärning.
  • Alla partitioner måste använda samma lagringsmotor.
  • FullTEXT-index stöds inte
  • Tillfälliga tabeller kan inte partitioneras

Alternativen ovan bör hjälpa dig att bestämma dig för om partitionering är ett alternativ för dig eller inte.

Partitioneringstyper

Om du bestämmer dig för att använda partitioner, kom ihåg att du har ett antal partitioneringstyper att välja mellan. Vi kommer kortfattat att täcka dina alternativ nedan och sedan dyka djupare in i dem:

  • Partitionering efter RANGE kan hjälpa dig att partitionera rader baserat på kolumnvärden som faller inom ett givet intervall.
  • Partitionering efter LIST kan hjälpa dig att partitionera rader baserat på medlemskapet av kolumnvärden i en given lista.
  • Partitionering av HASH kan hjälpa dig att partitionera rader baserat på ett värde som returneras av ett användardefinierat uttryck.
  • Partitionering av KEY kan hjälpa dig att partitionera rader baserat på en hashfunktion som tillhandahålls av MySQL.

Partitionering av RANGE

Partitionering av RANGE är en av de mest populära formerna för partitionering av MySQL-tabeller. När du partitionerar en tabell med RANGE, partitionerar du tabellen på ett sådant sätt att varje partition innehåller ett visst antal rader som faller inom ett givet intervall. För att definiera en partition, definiera namnet på den och tala om för den vilka värden den ska ha - för att partitionera en tabell efter intervall, lägg till en PARTITION BY RANGE-sats. Till exempel, om du skulle vilja namnge din partition p0 och få den att hålla alla värden som är mindre än 5, måste du se till att din fråga innehåller PARTITION p0-VÄRDEN MINDRE ÄN (5). Här är ett exempel på en partitionerad tabell:

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 också definiera en partition som innehåller alla värden som inte faller inom vissa intervall som så:

PARTITION p5 VALUES LESS THAN MAXVALUE

Ovanstående partition heter p5 och den innehåller alla värden som andra partitioner inte gör - MAXVALUE representerar ett värde som alltid är högre än det största möjliga värdet. Du kan också använda funktioner genom att definiera dina partitioner så här:

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 detta fall lagras alla värden som är mindre än 2000 i partitionen p0, alla värden som är mindre än 2010 lagras i partitionen p1, alla värden som är mindre än 2020 lagras i partitionen p2 och alla värden som inte faller inom något av dessa intervall lagras i partitionen p3.

Partitionering av LIST

Partitionering av MySQL-tabeller efter LIST liknar partitionering efter RANGE - den största skillnaden med att partitionera tabeller efter LIST är att när tabeller partitioneras av LIST definieras och väljs varje partition baserat på medlemskapet i ett kolumnvärde i en uppsättning värdelistor snarare än ett värdeintervall. Partitionering efter LIST kan vara användbart när du till exempel vet att du har data som kan delas upp i flera mindre uppsättningar data (t.ex. regioner). Anta att du har en butik som har fyra franchiseavtal:en i den centrala delen av staden, andra i norr, tredje i öst, fjärde i väster. Du kan partitionera en tabell på ett sådant sätt att data som tillhör en viss franchise skulle lagras i en partition dedikerad till den franchisen:

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 av MySQL-tabeller med HASH kan vara ett sätt att se till att data över partitionerna fördelas jämnt. Om du partitionerar dina tabeller med HASH behöver du bara ange hur många partitioner du vill att din data ska delas in i - resten sköts av MySQL. Du kan använda partitionering med HASH genom att lägga till följande sats till CREATE TABLE:

PARTITION BY HASH(id)

PARTITIONS 5;

Ersätt 5 med siffran som anger hur många partitioner du vill att dina data ska delas in i - standardnumret är 1.

MySQL stöder även partitionering med LINEAR HASH - linjär hashing skiljer sig från vanlig hashing eftersom linjär hashing använder en linjär tvåpotensalgoritm. För att partitionera tabeller med en LINJÄR HASH, ersätt PARTITION BY HASH med PARTITION BY LINEAR HASH.

Partitionering med KEY

Partitionering av MySQL-tabeller med KEY liknar att partitionera MySQL-tabeller med HASH - i det här fallet tillhandahålls hashfunktionen för nyckelpartitionering av MySQL-servern. Alla kolumner som används som partitioneringsnyckel måste omfatta hela tabellens primärnyckel eller åtminstone vara en del av tabellens primärnyckel. Om inget kolumnnamn anges som partitioneringsnyckel kommer primärnyckeln att användas. Om det inte finns någon primärnyckel, men det finns en unik nyckel, kommer den unika nyckeln att användas istället. Till exempel, följande satser är båda giltiga, även om den första satsen inte ens anger partitioneringsnyckeln:

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;

Slutsats

För att sammanfatta kan partitioner vara till hjälp om du har mycket data, dina tabeller är för stora för att få plats i minnet eller om de innehåller historiska data. Partitioner kan också vara användbara om du tror att du kommer att behöva distribuera innehållet i en tabell över olika lagringsmedier, även om du vill ha möjlighet att ta bort eller återställa enskilda partitioner.

Kom dock ihåg att partitioner i MySQL har sina egna nackdelar. En av de stora nackdelarna med partitionering är att det kommer att göra dina bord större - du kan inte få fart utan att kompromissa med utrymmet. Om du har en mycket stor uppsättning data kan detta vara ett ganska stort problem.


  1. Använda JSONB i PostgreSQL:Hur man effektivt lagrar och indexerar JSON-data i PostgreSQL

  2. CONVERT() i SQL Server

  3. 4 sätt att infoga flera rader i Oracle

  4. MySql summaelement i en kolumn