Heim > Datenbank > MySQL-Tutorial > Hauptteil

Ändern Sie das Partitionsfeld online in der MySQL-Partitionstabellenpartition und erfahren Sie später mehr über die Partition (1)

黄舟
Freigeben: 2017-02-17 13:10:18
Original
1695 Leute haben es durchsucht

Das Unternehmen verwendet die Partition online und das Partitionsfeld einer Tabelle ist falsch und muss neu erstellt werden. Es stellt sich heraus, dass es keine Möglichkeit gibt, dies direkt mit einer SQL zu tun, wie z. B. das Ändern des Primärschlüsselfelds oder des Index Feld. Stattdessen müssen wir eine temporäre Tabelle erstellen und Ausfallzeiten haben. Deshalb habe ich die Dokumentation sorgfältig gelesen und die Details der Partition studiert.

Wenn mein Unternehmen es während der Spitzenlastzeit um 1 Uhr morgens online stellt, führen Sie Folgendes aus:

Erstellen Sie eine temporäre Tabelle

CREATE TABLE tbname_TMP (    
SHARD_ID INT NOT NULL,    
...
    xxx_DATE DATETIME NOT NULL,    
    PRIMARY KEY (xxx_DATE,shard_id)) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_binPARTITION BY LIST(MONTH(xxx_DATE)) (    
    PARTITION m1 VALUES IN (1),    
    PARTITION m2 VALUES IN (2),    
    PARTITION m3 VALUES IN (3),    
    PARTITION m4 VALUES IN (4),    
    PARTITION m5 VALUES IN (5),    
    PARTITION m6 VALUES IN (6),    
    PARTITION m7 VALUES IN (7),    
    PARTITION m8 VALUES IN (8),    
    PARTITION m9 VALUES IN (9),    
    PARTITION m10 VALUES IN (10),    
    PARTITION m11 VALUES IN (11),    
    PARTITION m12 VALUES IN (12)
    );
Nach dem Login kopieren

Tabellennamen ändern, Tabellenstruktur ändern

RENAME TABLE xxx TO xxx_DELETED, xxx_TMP TO xxx;
Nach dem Login kopieren

Originaldaten importieren

insert into xxx select * from xxx_DELETEDxxx_DELETED;
Nach dem Login kopieren

OK, alles ist erledigt, das Der gesamte Vorgang dauert 50 Minuten, die Umrissoperation ändert die Tabellenstruktur und den Datenimport nach dem MMM-Failover-Switching. Die tatsächliche Ausfallzeit umfasst nicht die Zeit zum Ändern des Tabellenstruktur-Partitionsfelds, nur die Failover-Switching-Zeit beträgt 30 Sekunden

MySQL-Partition, ich habe die offiziellen englischen Informationen gelesen, der Übersetzungsgrad ist begrenzt, einige sind nicht ins Chinesische übersetzt und werden direkt auf Englisch veröffentlicht.
1 Listenpartitionstabelle

mysql> CREATE TABLE `eh` (
    ->   `id` int(11) NOT NULL,
    ->   `ENTITLEMENT_HIST_ID` bigint(20) NOT NULL,
    ->   `ENTITLEMENT_ID` bigint(20) NOT NULL,
    ->   `USER_ID` bigint(20) NOT NULL,
    ->   `DATE_CREATED` datetime NOT NULL,
    ->   `STATUS` smallint(6) NOT NULL,
    ->   `CREATED_BY` varchar(32) COLLATE utf8_bin DEFAULT NULL,
    ->   `MODIFIED_BY` varchar(32) COLLATE utf8_bin DEFAULT NULL,
    ->   `DATE_MODIFIED` datetime NOT NULL,
    ->   PRIMARY KEY (`DATE_MODIFIED`,`id`)
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
    -> /*!50100 PARTITION BY LIST (MONTH(DATE_MODIFIED))
    -> (PARTITION m1 VALUES IN (1) ENGINE = InnoDB,
    ->  PARTITION m2 VALUES IN (2) ENGINE = InnoDB,
    ->  PARTITION m3 VALUES IN (3) ENGINE = InnoDB,
    ->  PARTITION m4 VALUES IN (4) ENGINE = InnoDB,
    ->  PARTITION m5 VALUES IN (5) ENGINE = InnoDB,
    ->  PARTITION m6 VALUES IN (6) ENGINE = InnoDB,
    ->  PARTITION m7 VALUES IN (7) ENGINE = InnoDB,
    ->  PARTITION m8 VALUES IN (8) ENGINE = InnoDB,
    ->  PARTITION m9 VALUES IN (9) ENGINE = InnoDB,
    ->  PARTITION m10 VALUES IN (10) ENGINE = InnoDB,
    ->  PARTITION m11 VALUES IN (11) ENGINE = InnoDB,
    ->  PARTITION m12 VALUES IN (12) ENGINE = InnoDB) */;
Query OK, 0 rows affected (0.10 sec)
Nach dem Login kopieren


2 Rangpartitionstabelle

mysql> CREATE TABLE rcx (
    ->     a INT,
    ->     b INT,
    ->     c CHAR(3),
    ->     d INT
    -> )
    -> PARTITION BY RANGE COLUMNS(a,d,c) (
    ->     PARTITION p0 VALUES LESS THAN (5,10,'ggg'),
    ->     PARTITION p1 VALUES LESS THAN (10,20,'mmmm'),
    ->     PARTITION p2 VALUES LESS THAN (15,30,'sss'),
    ->     PARTITION p3 VALUES LESS THAN (MAXVALUE,MAXVALUE,MAXVALUE)
    -> );
Query OK, 0 rows affected (0.15 sec)
Nach dem Login kopieren

3 Bereich erstellen, weniger Zeichen verwenden

CREATE TABLE employees_by_lname (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT NOT NULL,
    store_id INT NOT NULL
)
Nach dem Login kopieren
PARTITION BY RANGE COLUMNS (lname)  (
    PARTITION p0 VALUES LESS THAN ('g'),
    PARTITION p1 VALUES LESS THAN ('m'),
    PARTITION p2 VALUES LESS THAN ('t'),
    PARTITION p3 VALUES LESS THAN (MAXVALUE)
);
Nach dem Login kopieren

Tabellenstruktur ändern, neuen Partitionsblock hinzufügen

ALTER TABLE employees_by_lname PARTITION BY RANGE COLUMNS (lname)  (
    PARTITION p0 VALUES LESS THAN ('g'),
    PARTITION p1 VALUES LESS THAN ('m'),
    PARTITION p2 VALUES LESS THAN ('t'),
 PARTITION p3 VALUES LESS THAN ('u'),
    PARTITION p4 VALUES LESS THAN (MAXVALUE)
);
Nach dem Login kopieren


4 Listenspaltenpartitionierung

character column
CREATE TABLE customers_1 (
    first_name VARCHAR(25),
    last_name VARCHAR(25),
    street_1 VARCHAR(30),
    street_2 VARCHAR(30),
    city VARCHAR(15),
    renewal DATE
)
Nach dem Login kopieren
PARTITION BY LIST COLUMNS(city) (
    PARTITION pRegion_1 VALUES IN('Oskarshamn', 'H?gsby', 'M?nster?s'),
    PARTITION pRegion_2 VALUES IN('Vimmerby', 'Hultsfred', 'V?stervik'),
    PARTITION pRegion_3 VALUES IN('N?ssj?', 'Eksj?', 'Vetlanda'),
    PARTITION pRegion_4 VALUES IN('Uppvidinge', 'Alvesta', 'V?xjo')
);
Nach dem Login kopieren

Datumsspalte

CREATE TABLE customers_2 (
    first_name VARCHAR(25),
    last_name VARCHAR(25),
    street_1 VARCHAR(30),
    street_2 VARCHAR(30),
    city VARCHAR(15),
    renewal DATE
)
Nach dem Login kopieren
PARTITION BY LIST COLUMNS(renewal) (
    PARTITION pWeek_1 VALUES IN('2010-02-01', '2010-02-02', '2010-02-03',
        '2010-02-04', '2010-02-05', '2010-02-06', '2010-02-07'),
    PARTITION pWeek_2 VALUES IN('2010-02-08', '2010-02-09', '2010-02-10',
        '2010-02-11', '2010-02-12', '2010-02-13', '2010-02-14'),
    PARTITION pWeek_3 VALUES IN('2010-02-15', '2010-02-16', '2010-02-17',
        '2010-02-18', '2010-02-19', '2010-02-20', '2010-02-21'),
    PARTITION pWeek_4 VALUES IN('2010-02-22', '2010-02-23', '2010-02-24',
        '2010-02-25', '2010-02-26', '2010-02-27', '2010-02-28')
);
Nach dem Login kopieren

5 HASH-Partitionierung

int column,it can use digital function
CREATE TABLE employeesint (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT,
    store_id INT
)
PARTITION BY HASH(MOD(store_id,4))
PARTITIONS 4;
Nach dem Login kopieren

Wenn Sie keine PARTITIONS-Klausel einfügen, ist die Anzahl der Partitionen standardmäßig 1. as unten:

CREATE TABLE employeestest (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT,
    store_id INT
)
PARTITION BY HASH(store_id);
Nach dem Login kopieren

Datumsspalte

CREATE TABLE employees2 (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT,
    store_id INT
)
PARTITION BY HASH( YEAR(hired) )
PARTITIONS 4;
Nach dem Login kopieren

Alle Datenzeilen abschneiden: Tabelle ändern rcx truncate PARTITION;

6 LINEARE HASH-Partitionierung

CREATE TABLE employees_linear (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT,
    store_id INT
)
Nach dem Login kopieren

PARTITION NACH LINEAREM HASH( JAHR(angestellt) )
PARTITIONEN 4;

Gegeben ein Ausdruck expr, ist die Partition, in der der Datensatz gespeichert wird, wenn lineares Hashing verwendet wird Partitionsnummer N aus Num-Partitionen, wobei N gemäß dem folgenden Algorithmus abgeleitet wird:
(1) Finden Sie die nächste Potenz von 2, die größer als Num ist. Wir nennen diesen Wert V; er kann wie folgt berechnet werden:
= POWER(2, CEILING(LOG(2, num)))
(Angenommen, num ist 13. Dann ist LOG(2,13) ​​​​​​3,7004397181411. CEILING(3,7004397181411) ist 4 und V = POWER(2 ,4 ), also 16.)
(2) Setze N = F(column_list) & (V - 1) (3) Während N >= num:
Setze V = CEIL( V / 2)
Setze N = N & (V - 1)


[Hinweis] Das Berechnungsprinzip von & in SQL lautet: Zum Beispiel
Konvertieren Sie Dezimalzahl in Binärzahl und Sie erhalten http://www.php.cn/

Zuerst nach rechts ausrichten, zum Beispiel 0011 und 1000 werden, anhand der Anzahl jeder Ziffer beurteilen, wenn beide 1 sind, dann das Ergebnis Die entsprechende Position ist 1, andernfalls ist sie 0
Wenn es 1011 und 1000 ist, ist das Ergebnis 1000
Wenn es 0110 und 1010 ist, ist das Ergebnis 0010
Aber 3 ist 0011, 8 ist 1000, Das Ergebnis von 3&8 ist also 0

CEILING(X) CEIL(X): Gibt den kleinsten ganzzahligen Wert zurück, der nicht kleiner als X ist.

LOG(X) LOG(B,X): Wenn diese Funktion mit einem Parameter aufgerufen wird, gibt sie den natürlichen Logarithmus von X zurück.
POWER(X,Y): Gibt den Ergebniswert von X potenziert mit Y zurück.


Berechnungsmethode, in welcher Kachel die Daten verteilt sind:
Angenommen, die Tabelle t1, die lineare Hash-Partitionierung verwendet und 6 Partitionen hat, wird mit dieser Anweisung erstellt:

CREATE TABLE t1 (col1 INT, col2 CHAR(5), col3 DATE)
    PARTITION BY LINEAR HASH( YEAR(col3) )
    PARTITIONS 6;
Nach dem Login kopieren
Nehmen Sie nun an, dass Sie zwei Datensätze in t1 mit den Spaltenwerten „2003-04-14“ und „1998-10-19“ einfügen möchten. Die Partitionsnummer für den ersten diese werden wie folgt ermittelt:


 V = POWER(2, CEILING( LOG(2,6) )) = 8
 N = YEAR('2003-04-14') & (8 - 1)
    = 2003 & 7
    = 3
 (3 >= 6 is FALSE: record stored in partition #3)
Nach dem Login kopieren

Die Nummer der Partition, in der der zweite Datensatz gespeichert ist, wird wie hier gezeigt berechnet:

 V = 8 N = YEAR('1998-10-19') & (8-1)   = 1998 & 7   = 6
 (6 >= 6 is TRUE: additional step required)
 N = 6 & CEILING(8 / 2)   = 6 & 3   = 2
 (2 >= 6 is FALSE: record stored in partition #2)
Nach dem Login kopieren

Der Vorteil der Partitionierung durch linearen Hash besteht darin, dass das Hinzufügen, Löschen, Zusammenführen und Teilen von Partitionen viel schneller erfolgt, was beim Umgang mit Tabellen mit extrem großen Datenmengen (Terabyte) von Vorteil sein kann Nachteil ist dass die Wahrscheinlichkeit einer gleichmäßigen Verteilung der Daten zwischen den Partitionen geringer ist als bei der Verteilung, die mit der regulären Hash-Partitionierung erzielt wird.

Eine der Fragen: Wie verwendet MySQL ein SQL, ohne eine temporäre Tabelle zu verwenden? ? Partitionsfeld löschen? Eine partitionierte Tabelle in eine normale Tabelle umwandeln?

Im Folgenden erfahren Sie, wie Sie das Partitionsfeld online in der MySQL-Partitionstabelle ändern. Weitere Informationen finden Sie hier Verwandte Inhalte, achten Sie bitte auf die chinesische PHP-Website (www.php.cn)!




Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!