Apa itu partisi MySQL? Show
Partisi MySQL adalah tentang mengubah – idealnya, mengoptimalkan – cara mesin database menyimpan data secara fisik. Ini memungkinkan Anda untuk mendistribusikan sebagian dari data tabel (mis. k. a. partisi) di seluruh sistem file berdasarkan seperangkat aturan yang ditentukan pengguna (a. k. a. "fungsi partisi"). Dengan cara ini, jika kueri yang Anda lakukan hanya mengakses sebagian kecil dari data tabel dan fungsi partisi diatur dengan benar, pemindaian akan lebih sedikit dan kueri akan lebih cepat Penting untuk dicatat bahwa mempartisi paling masuk akal saat menangani kumpulan data besar. Jika Anda memiliki kurang dari satu juta baris atau hanya ribuan rekaman, mempartisi tidak akan membuat perbedaan Horisontal vs. Partisi VertikalPartisi horizontal berarti bahwa semua baris yang cocok dengan fungsi partisi akan ditetapkan ke partisi fisik yang berbeda. Partisi vertikal memungkinkan kolom tabel yang berbeda dipecah menjadi partisi fisik yang berbeda. Saat ini, MySQL mendukung partisi horizontal tetapi tidak vertikal. Dokumentasi mesin dengan jelas menyatakan tidak akan mendukung partisi vertikal dalam waktu dekat. ”Saat ini tidak ada rencana untuk memperkenalkan partisi vertikal ke dalam MySQL. ” Partisi vertikal adalah tentang memisahkan kolom Partisi horizontal adalah tentang memisahkan baris Manfaat Utama PartisiBeberapa keuntungan menggunakan partisi adalah
Cara Memeriksa Apakah Mesin Anda Mendukung PartisiSecara default, binari komunitas menyertakan dukungan partisi. Anda dapat memeriksa apakah itu didukung dalam instans Anda saat ini dengan menjalankan pernyataan CREATE TABLE userslogs ( id INT NOT NULL AUTO_INCREMENT, username VARCHAR(20) NOT NULL, logdata BLOB NOT NULL, created DATETIME NOT NULL, PRIMARY KEY(id), UNIQUE KEY (username, created) ) PARTITION BY HASH( TO_DAYS(created) ) PARTITIONS 10;2. Outputnya harus menampilkan sesuatu seperti baris berikut | Name | Status | Type | Library | License | | partition | ACTIVE | STORAGE ENGINE | NULL | GPL |_ Alternatif lain adalah dengan mencentang CREATE TABLE userslogs ( id INT NOT NULL AUTO_INCREMENT, username VARCHAR(20) NOT NULL, logdata BLOB NOT NULL, created DATETIME NOT NULL, PRIMARY KEY(id), UNIQUE KEY (username, created) ) PARTITION BY HASH( TO_DAYS(created) ) PARTITIONS 10;_3 SELECT PLUGIN_NAME as Name, PLUGIN_VERSION as Version, PLUGIN_STATUS as Status FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_TYPE='STORAGE ENGINE'; Anda harus mendapatkan sesuatu seperti ini | Name | Version | Status | | partition | 1.0 | ACTIVE | Kedua output mencatat bahwa plugin yang Anda cari bernama "partisi" dan disetel ke AKTIF. Jika Anda tidak melihat partisi yang terdaftar dengan salah satu dari metode ini, versi MySQL Anda mungkin diinstal tanpa dukungan partisi. Dalam hal ini, kompilasi MySQL lain harus dilakukan dengan opsi – CREATE TABLE userslogs ( id INT NOT NULL AUTO_INCREMENT, username VARCHAR(20) NOT NULL, logdata BLOB NOT NULL, created DATETIME NOT NULL, PRIMARY KEY(id), UNIQUE KEY (username, created) ) PARTITION BY HASH( TO_DAYS(created) ) PARTITIONS 10;4. Dokumentasi “Installing MySQL from Source” akan menunjukkan cara melakukan ini Dasar-dasar PartisiSebelum melangkah lebih jauh, penting untuk mencatat beberapa pertimbangan umum terkait dengan partisi
Catatan. Dokumentasi MySQL menjelaskan batasan dan batasan partisi Kolom Partisi DijelaskanSeperti yang dinyatakan sebelumnya, semua kolom yang digunakan dalam ekspresi partisi harus ada di setiap kunci unik dalam tabel, termasuk kunci utama (yang menurut definisi UNIK). Dengan kata lain, semua kunci unik dalam tabel harus menggunakan semua kolom dalam ekspresi partisi Misalnya, ini… CREATE TABLE userslogs ( id INT NOT NULL AUTO_INCREMENT, username VARCHAR(20) NOT NULL, logdata BLOB NOT NULL, created DATETIME NOT NULL, PRIMARY KEY(id), UNIQUE KEY (username, created) ) PARTITION BY HASH( TO_DAYS(created) ) PARTITIONS 10; .. tidak dapat dipartisi, karena "dibuat" bukan bagian dari setiap kunci unik dalam tabel. Dalam hal ini, kunci utama tidak menyertakan "dibuat", sehingga pernyataan tersebut gagal Error Code: 1503. A PRIMARY KEY must include all columns in the table's partitioning function Kami dapat menulis ulang CREATE TABLE userslogs ( id INT NOT NULL AUTO_INCREMENT, username VARCHAR(20) NOT NULL, logdata BLOB NOT NULL, created DATETIME NOT NULL, PRIMARY KEY(id), UNIQUE KEY (username, created) ) PARTITION BY HASH( TO_DAYS(created) ) PARTITIONS 10;_8 seperti ini (tergantung kasus penggunaan Anda) CREATE TABLE userslogs ( username VARCHAR(20) NOT NULL, logdata BLOB NOT NULL, created DATETIME NOT NULL, PRIMARY KEY(username, created) ) PARTITION BY HASH( TO_DAYS(created) ) PARTITIONS 10; Jika Anda membuat tabel tanpa kunci unik (termasuk kunci utama), kolom apa pun dapat digunakan dalam ekspresi pemartisian yang kompatibel dengan tipe pemartisian Selanjutnya, saya akan menjelaskan jenis partisi apa yang tersedia di MySQL pada versi 5. 7 Jenis PartisiPada dasarnya ada empat jenis partisi yang tersedia. CREATE TABLE userslogs ( id INT NOT NULL AUTO_INCREMENT, username VARCHAR(20) NOT NULL, logdata BLOB NOT NULL, created DATETIME NOT NULL, PRIMARY KEY(id), UNIQUE KEY (username, created) ) PARTITION BY HASH( TO_DAYS(created) ) PARTITIONS 10;9, Error Code: 1503. A PRIMARY KEY must include all columns in the table's partitioning function0, Error Code: 1503. A PRIMARY KEY must include all columns in the table's partitioning function1 dan Error Code: 1503. A PRIMARY KEY must include all columns in the table's partitioning function2. Saya akan menjelaskan masing-masing sekarang. Nanti kita akan melihat beberapa contoh praktis penggunaan RANGE, jenis partisi yang kemungkinan besar akan paling sering Anda gunakan Partisi RANGEJenis partisi ini menetapkan baris ke partisi berdasarkan nilai kolom yang termasuk dalam rentang yang dinyatakan. Nilai harus bersebelahan, tetapi tidak boleh saling tumpang tindih. Operator Error Code: 1503. A PRIMARY KEY must include all columns in the table's partitioning function_3 akan digunakan untuk menentukan rentang tersebut dalam urutan dari terendah ke tertinggi (persyaratan untuk tipe partisi ini). Juga, ekspresi partisi – dalam contoh berikut, adalah Error Code: 1503. A PRIMARY KEY must include all columns in the table's partitioning function4 – harus menghasilkan nilai integer atau NULL Seperti contoh di atas, kita bisa mempartisi tabel seperti ini CREATE TABLE userslogs ( username VARCHAR(20) NOT NULL, logdata BLOB NOT NULL, created DATETIME NOT NULL, PRIMARY KEY(username, created) ) PARTITION BY RANGE( YEAR(created) )( PARTITION from_2013_or_less VALUES LESS THAN (2014), PARTITION from_2014 VALUES LESS THAN (2015), PARTITION from_2015 VALUES LESS THAN (2016), PARTITION from_2016_and_up VALUES LESS THAN MAXVALUE Perhatikan ekspresi Error Code: 1503. A PRIMARY KEY must include all columns in the table's partitioning function_5 yang saya gunakan dalam definisi ini. Ini tidak wajib, tetapi berfungsi sebagai penampung semua untuk log yang sama dengan atau lebih besar dari nilai maks (tahun 2016). Jika saya tidak melakukan ini, pertimbangkan apa yang akan terjadi jika ada ERROR 1488 (HY000): Duplicate partition name myvertabelopart7 dengan nilai Error Code: 1503. A PRIMARY KEY must include all columns in the table's partitioning function7 pada tahun 2020. Itu akan gagal, karena tidak akan ada definisi partisi untuk nilai itu Seiring berjalannya waktu dan 2017 dimulai, Anda mungkin (bergantung pada kasus penggunaan Anda) merasa berguna untuk membuat partisi baru untuk tabel ini. Anda melakukan ini dengan mengubah definisi partisi untuk menghasilkan partisi baru untuk baris dari 2016 ( Error Code: 1503. A PRIMARY KEY must include all columns in the table's partitioning function8) serta catatan dari 2017 dan setelahnya ( Error Code: 1503. A PRIMARY KEY must include all columns in the table's partitioning function9). Anda bisa menggunakan logika yang sama untuk tahun-tahun lainnya Sehubungan dengan nilai NULL, penting untuk dicatat bahwa baris tersebut akan berada di partisi yang lebih rendah. Dalam contoh sebelumnya, TAHUN dengan NULL akan dievaluasi sebagai CREATE TABLE userslogs ( username VARCHAR(20) NOT NULL, logdata BLOB NOT NULL, created DATETIME NOT NULL, PRIMARY KEY(username, created) ) PARTITION BY HASH( TO_DAYS(created) ) PARTITIONS 10;0, oleh karena itu akan berakhir di dalam CREATE TABLE userslogs ( username VARCHAR(20) NOT NULL, logdata BLOB NOT NULL, created DATETIME NOT NULL, PRIMARY KEY(username, created) ) PARTITION BY HASH( TO_DAYS(created) ) PARTITIONS 10;1 CREATE TABLE userslogs ( id INT NOT NULL AUTO_INCREMENT, username VARCHAR(20) NOT NULL, logdata BLOB NOT NULL, created DATETIME NOT NULL, PRIMARY KEY(id), UNIQUE KEY (username, created) ) PARTITION BY HASH( TO_DAYS(created) ) PARTITIONS 10;9 partisi berfungsi paling baik untuk
Alternatif untuk CREATE TABLE userslogs ( id INT NOT NULL AUTO_INCREMENT, username VARCHAR(20) NOT NULL, logdata BLOB NOT NULL, created DATETIME NOT NULL, PRIMARY KEY(id), UNIQUE KEY (username, created) ) PARTITION BY HASH( TO_DAYS(created) ) PARTITIONS 10;9 adalah CREATE TABLE userslogs ( username VARCHAR(20) NOT NULL, logdata BLOB NOT NULL, created DATETIME NOT NULL, PRIMARY KEY(username, created) ) PARTITION BY HASH( TO_DAYS(created) ) PARTITIONS 10;8, yang memungkinkan ekspresi menyertakan lebih dari satu kolom yang melibatkan kolom tipe STRING, INT, DATE, dan TIME (tetapi bukan fungsi). Dalam kasus seperti itu, operator Error Code: 1503. A PRIMARY KEY must include all columns in the table's partitioning function_3 harus menyertakan nilai sebanyak kolom yang tercantum dalam ekspresi partisi. Sebagai contoh CREATE TABLE rc1 ( a INT, b INT ) PARTITION BY RANGE COLUMNS(a, b) ( PARTITION p0 VALUES LESS THAN (5, 12), PARTITION p3 VALUES LESS THAN (MAXVALUE, MAXVALUE) ); Nilai akan dibandingkan dalam tupel; INSERT INTO rc1 (a,b) VALUES (4,11); INSERT INTO rc1 (a,b) VALUES (5,11); INSERT INTO rc1 (a,b) VALUES (6,11); INSERT INTO rc1 (a,b) VALUES (4,12); INSERT INTO rc1 (a,b) VALUES (5,12); INSERT INTO rc1 (a,b) VALUES (6,12); INSERT INTO rc1 (a,b) VALUES (4,13); INSERT INTO rc1 (a,b) VALUES (5,13); INSERT INTO rc1 (a,b) VALUES (6,13); .. akan ditempatkan dengan cara berikut abpartitioncomparison411p0(4,11) < (5,12) = true412p0(4,12) < (5,12) = true413p0(4,13) < (5,12) = true511p0(5,11) < (5,12 Anda dapat memverifikasi ini sendiri menggunakan cuplikan kode ini SELECT PLUGIN_NAME as Name, PLUGIN_VERSION as Version, PLUGIN_STATUS as Status FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_TYPE='STORAGE ENGINE';_0 DAFTAR PartisiError Code: 1503. A PRIMARY KEY must include all columns in the table's partitioning function_0 mempartisi mirip dengan CREATE TABLE userslogs ( id INT NOT NULL AUTO_INCREMENT, username VARCHAR(20) NOT NULL, logdata BLOB NOT NULL, created DATETIME NOT NULL, PRIMARY KEY(id), UNIQUE KEY (username, created) ) PARTITION BY HASH( TO_DAYS(created) ) PARTITIONS 10;9, kecuali bahwa partisi dipilih berdasarkan kolom yang cocok dengan salah satu dari sekumpulan nilai diskrit. Dalam hal ini, pernyataan CREATE TABLE userslogs ( username VARCHAR(20) NOT NULL, logdata BLOB NOT NULL, created DATETIME NOT NULL, PRIMARY KEY(username, created) ) PARTITION BY RANGE( YEAR(created) )( PARTITION from_2013_or_less VALUES LESS THAN (2014), PARTITION from_2014 VALUES LESS THAN (2015), PARTITION from_2015 VALUES LESS THAN (2016), PARTITION from_2016_and_up VALUES LESS THAN MAXVALUE_3 akan digunakan untuk menentukan kriteria pencocokan. Mari kita lihat contohnya SELECT PLUGIN_NAME as Name, PLUGIN_VERSION as Version, PLUGIN_STATUS as Status FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_TYPE='STORAGE ENGINE';_1 Perhatikan bahwa dalam partisi Error Code: 1503. A PRIMARY KEY must include all columns in the table's partitioning function_0, tidak ada catch-all (seperti ekspresi Error Code: 1503. A PRIMARY KEY must include all columns in the table's partitioning function5 di CREATE TABLE userslogs ( id INT NOT NULL AUTO_INCREMENT, username VARCHAR(20) NOT NULL, logdata BLOB NOT NULL, created DATETIME NOT NULL, PRIMARY KEY(id), UNIQUE KEY (username, created) ) PARTITION BY HASH( TO_DAYS(created) ) PARTITIONS 10;9). Anda harus mencakup semua kemungkinan elemen dalam daftar kriteria untuk mencegah kesalahan ERROR 1488 (HY000): Duplicate partition name myvertabelopart7 Perlu dicatat bahwa di sini nilai NULL diperlakukan seperti nilai lainnya. Dalam contoh di atas, jika CREATE TABLE userslogs ( username VARCHAR(20) NOT NULL, logdata BLOB NOT NULL, created DATETIME NOT NULL, PRIMARY KEY(username, created) ) PARTITION BY RANGE( YEAR(created) )( PARTITION from_2013_or_less VALUES LESS THAN (2014), PARTITION from_2014 VALUES LESS THAN (2015), PARTITION from_2015 VALUES LESS THAN (2016), PARTITION from_2016_and_up VALUES LESS THAN MAXVALUE_8 adalah NULLable dan ekspresi dievaluasi menjadi NULL untuk record tertentu, maka baris tersebut akan berakhir di partisi yang menerima NULL sebagai nilai yang memungkinkan. Kalau tidak, itu akan ditolak, karena CREATE TABLE userslogs ( username VARCHAR(20) NOT NULL, logdata BLOB NOT NULL, created DATETIME NOT NULL, PRIMARY KEY(username, created) ) PARTITION BY RANGE( YEAR(created) )( PARTITION from_2013_or_less VALUES LESS THAN (2014), PARTITION from_2014 VALUES LESS THAN (2015), PARTITION from_2015 VALUES LESS THAN (2016), PARTITION from_2016_and_up VALUES LESS THAN MAXVALUE3 memutuskan nilai apa yang akan dimasukkan ke dalam catatan mana Error Code: 1503. A PRIMARY KEY must include all columns in the table's partitioning function_0 dilengkapi dengan alternatif – CREATE TABLE rc1 ( a INT, b INT ) PARTITION BY RANGE COLUMNS(a, b) ( PARTITION p0 VALUES LESS THAN (5, 12), PARTITION p3 VALUES LESS THAN (MAXVALUE, MAXVALUE) );1. Seperti CREATE TABLE userslogs ( username VARCHAR(20) NOT NULL, logdata BLOB NOT NULL, created DATETIME NOT NULL, PRIMARY KEY(username, created) ) PARTITION BY HASH( TO_DAYS(created) ) PARTITIONS 10;_8, pernyataan ini dapat menyertakan beberapa kolom dan tipe data non-INT, seperti STRING, DATE, dan TIME. Sintaks umum akan terlihat seperti ini SELECT PLUGIN_NAME as Name, PLUGIN_VERSION as Version, PLUGIN_STATUS as Status FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_TYPE='STORAGE ENGINE';_2 Mempertahankan banyak kolom dengan banyak nilai biasanya akan merepotkan, jadi kemungkinan besar Anda akan menggunakan CREATE TABLE rc1 ( a INT, b INT ) PARTITION BY RANGE COLUMNS(a, b) ( PARTITION p0 VALUES LESS THAN (5, 12), PARTITION p3 VALUES LESS THAN (MAXVALUE, MAXVALUE) );1 saat Anda perlu menggunakan banyak kolom non-INT. Ini ditunjukkan dalam contoh berikut SELECT PLUGIN_NAME as Name, PLUGIN_VERSION as Version, PLUGIN_STATUS as Status FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_TYPE='STORAGE ENGINE';_3 Partisi HASHDalam Error Code: 1503. A PRIMARY KEY must include all columns in the table's partitioning function_1 partisi, partisi dipilih berdasarkan nilai yang dikembalikan oleh ekspresi yang ditentukan pengguna. Ekspresi ini beroperasi pada nilai kolom dalam baris yang akan disisipkan ke dalam tabel. Ekspresi partisi Error Code: 1503. A PRIMARY KEY must include all columns in the table's partitioning function_1 dapat terdiri dari ekspresi MySQL apa pun yang valid yang menghasilkan nilai integer nonnegatif. Error Code: 1503. A PRIMARY KEY must include all columns in the table's partitioning function_1 digunakan terutama untuk mendistribusikan data secara merata di antara jumlah partisi yang dipilih pengguna Untuk CREATE TABLE userslogs ( id INT NOT NULL AUTO_INCREMENT, username VARCHAR(20) NOT NULL, logdata BLOB NOT NULL, created DATETIME NOT NULL, PRIMARY KEY(id), UNIQUE KEY (username, created) ) PARTITION BY HASH( TO_DAYS(created) ) PARTITIONS 10;_9 dan Error Code: 1503. A PRIMARY KEY must include all columns in the table's partitioning function0, seseorang harus menentukan partisi tempat data akan disimpan; . Mari kita lihat cara kerjanya SELECT PLUGIN_NAME as Name, PLUGIN_VERSION as Version, PLUGIN_STATUS as Status FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_TYPE='STORAGE ENGINE';_4 Catatan. Jika Anda tidak menyertakan kata kunci PARTITIONS, jumlah partisi default adalah "1", dan itulah jumlah yang akan Anda dapatkan Berikut adalah beberapa rekomendasi tentang penggunaan Error Code: 1503. A PRIMARY KEY must include all columns in the table's partitioning function_1 partisi
HASH LINEARAlih-alih menggunakan modulo yang dijelaskan di atas, ketika MySQL menggunakan INSERT INTO rc1 (a,b) VALUES (4,11); INSERT INTO rc1 (a,b) VALUES (5,11); INSERT INTO rc1 (a,b) VALUES (6,11); INSERT INTO rc1 (a,b) VALUES (4,12); INSERT INTO rc1 (a,b) VALUES (5,12); INSERT INTO rc1 (a,b) VALUES (6,12); INSERT INTO rc1 (a,b) VALUES (4,13); INSERT INTO rc1 (a,b) VALUES (5,13); INSERT INTO rc1 (a,b) VALUES (6,13);5, algoritma kekuatan dua digunakan untuk menghitung partisi tempat data disimpan. Secara sintaksis, INSERT INTO rc1 (a,b) VALUES (4,11); INSERT INTO rc1 (a,b) VALUES (5,11); INSERT INTO rc1 (a,b) VALUES (6,11); INSERT INTO rc1 (a,b) VALUES (4,12); INSERT INTO rc1 (a,b) VALUES (5,12); INSERT INTO rc1 (a,b) VALUES (6,12); INSERT INTO rc1 (a,b) VALUES (4,13); INSERT INTO rc1 (a,b) VALUES (5,13); INSERT INTO rc1 (a,b) VALUES (6,13);5 sama persis dengan Error Code: 1503. A PRIMARY KEY must include all columns in the table's partitioning function1, kecuali penambahan kata INSERT INTO rc1 (a,b) VALUES (4,11); INSERT INTO rc1 (a,b) VALUES (5,11); INSERT INTO rc1 (a,b) VALUES (6,11); INSERT INTO rc1 (a,b) VALUES (4,12); INSERT INTO rc1 (a,b) VALUES (5,12); INSERT INTO rc1 (a,b) VALUES (6,12); INSERT INTO rc1 (a,b) VALUES (4,13); INSERT INTO rc1 (a,b) VALUES (5,13); INSERT INTO rc1 (a,b) VALUES (6,13);9 SELECT PLUGIN_NAME as Name, PLUGIN_VERSION as Version, PLUGIN_STATUS as Status FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_TYPE='STORAGE ENGINE';_5 Dianjurkan untuk menggunakan hashing linier ketika berhadapan dengan tabel yang berisi jumlah yang sangat besar (mis. e. terabyte) data. Dalam kasus seperti itu, menambah, menjatuhkan, menggabungkan, dan memisahkan partisi jauh lebih cepat. Namun, ini ada harganya. distribusi data tidak sama dengan hashing biasa. Yang terbaik adalah memilih jumlah partisi yang merupakan kekuatan 2 (2,4,8,16, dll. ), jika tidak, ukuran partisi tengah akan cenderung dua kali ukuran partisi luar. Ini karena distribusi statistik dari hash linier Partisi KUNCIIni sangat mirip dengan partisi HASH, tetapi fungsi hash disediakan oleh MySQL. Partisi Error Code: 1503. A PRIMARY KEY must include all columns in the table's partitioning function_2 dapat menentukan nol atau banyak kolom, yang dapat berisi nilai non-bilangan bulat. Hasil integer akan dikembalikan terlepas dari tipe data kolom. Contoh berikut akan memperjelas hal ini SELECT PLUGIN_NAME as Name, PLUGIN_VERSION as Version, PLUGIN_STATUS as Status FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_TYPE='STORAGE ENGINE';_6 Di sini SELECT PLUGIN_NAME as Name, PLUGIN_VERSION as Version, PLUGIN_STATUS as Status FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_TYPE='STORAGE ENGINE';_01 telah digunakan tanpa secara eksplisit menyatakan kolom partisi. MySQL akan secara otomatis menggunakan primary key atau unique key sebagai kolom partisi. Jika tidak ada kunci unik yang tersedia, pernyataan akan gagal Seperti yang dinyatakan sebelumnya, kita dapat mendefinisikan beberapa kolom sebagai bagian dari kata kunci KEY. Hal ini ditunjukkan dalam contoh berikut SELECT PLUGIN_NAME as Name, PLUGIN_VERSION as Version, PLUGIN_STATUS as Status FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_TYPE='STORAGE ENGINE';_7 Error Code: 1503. A PRIMARY KEY must include all columns in the table's partitioning function2 dilengkapi dengan opsi kata kunci INSERT INTO rc1 (a,b) VALUES (4,11); INSERT INTO rc1 (a,b) VALUES (5,11); INSERT INTO rc1 (a,b) VALUES (6,11); INSERT INTO rc1 (a,b) VALUES (4,12); INSERT INTO rc1 (a,b) VALUES (5,12); INSERT INTO rc1 (a,b) VALUES (6,12); INSERT INTO rc1 (a,b) VALUES (4,13); INSERT INTO rc1 (a,b) VALUES (5,13); INSERT INTO rc1 (a,b) VALUES (6,13);9 yang memiliki dampak yang sama persis dengan kata kunci INSERT INTO rc1 (a,b) VALUES (4,11); INSERT INTO rc1 (a,b) VALUES (5,11); INSERT INTO rc1 (a,b) VALUES (6,11); INSERT INTO rc1 (a,b) VALUES (4,12); INSERT INTO rc1 (a,b) VALUES (5,12); INSERT INTO rc1 (a,b) VALUES (6,12); INSERT INTO rc1 (a,b) VALUES (4,13); INSERT INTO rc1 (a,b) VALUES (5,13); INSERT INTO rc1 (a,b) VALUES (6,13);9 di Error Code: 1503. A PRIMARY KEY must include all columns in the table's partitioning function1. partisi diturunkan menggunakan algoritma power-of-two. Lihat cara kerjanya dalam contoh berikut SELECT PLUGIN_NAME as Name, PLUGIN_VERSION as Version, PLUGIN_STATUS as Status FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_TYPE='STORAGE ENGINE';_8 Pemangkasan PartisiKonsep di balik pemangkasan partisi sangat sederhana. jangan mencari partisi di mana tidak ada yang bisa ditemukan. Ambil contoh berikut SELECT PLUGIN_NAME as Name, PLUGIN_VERSION as Version, PLUGIN_STATUS as Status FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_TYPE='STORAGE ENGINE';_9 Jika kita melakukan pernyataan ini… | Name | Version | Status | | partition | 1.0 | ACTIVE |_0 pengoptimal akan masuk dan meninggalkan partisi yang tidak perlu dari pencarian. Dengan demikian, kueri lebih efisien. Anda dapat melihat ini dengan menjalankan pernyataan SELECT PLUGIN_NAME as Name, PLUGIN_VERSION as Version, PLUGIN_STATUS as Status FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_TYPE='STORAGE ENGINE';_06 | Name | Version | Status | | partition | 1.0 | ACTIVE |_1 Keluaran menunjukkan bahwa hanya partisi SELECT PLUGIN_NAME as Name, PLUGIN_VERSION as Version, PLUGIN_STATUS as Status FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_TYPE='STORAGE ENGINE';_07 yang digunakan Pengoptimal secara otomatis "memangkas" hanya jika kondisi CREATE TABLE userslogs ( username VARCHAR(20) NOT NULL, logdata BLOB NOT NULL, created DATETIME NOT NULL, PRIMARY KEY(username, created) ) PARTITION BY HASH( TO_DAYS(created) ) PARTITIONS 10;5 dapat disederhanakan sebagai salah satu dari dua kasus berikut
Anda juga dapat memilih partisi secara eksplisit seperti ini | Name | Version | Status | | partition | 1.0 | ACTIVE |_2 Ketika nama partisi dihasilkan oleh MySQL (seperti pada partisi Error Code: 1503. A PRIMARY KEY must include all columns in the table's partitioning function1 dan Error Code: 1503. A PRIMARY KEY must include all columns in the table's partitioning function2) pola namanya adalah p0, p1,. , pN-1 (di mana N adalah jumlah partisi). Pemilihan partisi didukung untuk sebagian besar operasi seperti ERROR 1488 (HY000): Duplicate partition name myvertabelopart5, ERROR 1488 (HY000): Duplicate partition name myvertabelopart9, ERROR 1488 (HY000): Duplicate partition name myvertabelopart7, SELECT PLUGIN_NAME as Name, PLUGIN_VERSION as Version, PLUGIN_STATUS as Status FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_TYPE='STORAGE ENGINE';16, dll Kasus Penggunaan Khas. Data Deret WaktuPartisi biasanya digunakan saat menangani rangkaian data waktu yang berisi banyak record. Ini bisa berupa log atau catatan panggilan telepon, faktur, sampel, dll. Sebagian besar waktu, Anda akan membaca data baru, jadi akan ada banyak baris lama yang perlu dihapus setelah "basi" Untuk mengilustrasikan cara mengatasi masalah ini, saya akan menyajikan skenario kasus pengguna menggunakan 1. 8 juta rekaman dari jaringan stasiun cuaca. Saya akan melakukan beberapa operasi umum pada tabel "pengukuran" apa adanya; Jutaan RekorKami akan menggunakan tabel berikut | Name | Version | Status | | partition | 1.0 | ACTIVE |_3 Selanjutnya, kita akan membuat salinan dari yang pertama, menambahkan CREATE TABLE userslogs ( id INT NOT NULL AUTO_INCREMENT, username VARCHAR(20) NOT NULL, logdata BLOB NOT NULL, created DATETIME NOT NULL, PRIMARY KEY(id), UNIQUE KEY (username, created) ) PARTITION BY HASH( TO_DAYS(created) ) PARTITIONS 10;9 partisi | Name | Version | Status | | partition | 1.0 | ACTIVE |_4 Tolok Ukur Kueri SELECTMari jalankan sepasang kueri umum di kedua tabel dan lihat perbandingannya. (Saya akan menggunakan kata kunci SELECT PLUGIN_NAME as Name, PLUGIN_VERSION as Version, PLUGIN_STATUS as Status FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_TYPE='STORAGE ENGINE';_18 sehingga kita dapat melihat dampak kueri tanpa caching mesin) | Name | Version | Status | | partition | 1.0 | ACTIVE |_5 Dibutuhkan sekitar setengah detik pada mesin lokal saya untuk mengembalikan hitungan 112.153 baris untuk kedua kueri (dipartisi dan tidak dipartisi). Perhatikan bahwa kedua tabel memiliki indeks pada SELECT PLUGIN_NAME as Name, PLUGIN_VERSION as Version, PLUGIN_STATUS as Status FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_TYPE='STORAGE ENGINE';19; Jika saya menghapus indeks di kedua tabel, saya dapat melihat dampak apa pun yang ditimbulkan oleh partisi pada SELECT PLUGIN_NAME as Name, PLUGIN_VERSION as Version, PLUGIN_STATUS as Status FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_TYPE='STORAGE ENGINE';20 | Name | Version | Status | | partition | 1.0 | ACTIVE |_6 Kesimpulan. Menjalankan SELECT pada tabel yang tidak dipartisi membutuhkan waktu sekitar dua kali lipat dari kueri yang sama pada tabel yang dipartisi Tolok Ukur Penghapusan BesarSaya akan mencoba menghapus data lama secara besar-besaran dan melihat berapa lama waktu yang dibutuhkan. Sebelum saya melakukannya, mari tambahkan indeks kembali pada kolom SELECT PLUGIN_NAME as Name, PLUGIN_VERSION as Version, PLUGIN_STATUS as Status FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_TYPE='STORAGE ENGINE';19 | Name | Version | Status | | partition | 1.0 | ACTIVE |7 | Name | Version | Status | | partition | 1.0 | ACTIVE |8 Kami memilikinya seperti aslinya, dengan data yang diindeks Sekarang mari kita lakukan penghapusan besar-besaran pada tabel yang tidak dipartisi | Name | Version | Status | | partition | 1.0 | ACTIVE |_9 Dibutuhkan sekitar 0. 7 detik untuk menghapus 85.314 baris. Bagaimana jika saya menjalankan SELECT PLUGIN_NAME as Name, PLUGIN_VERSION as Version, PLUGIN_STATUS as Status FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_TYPE='STORAGE ENGINE';_22 untuk mencapai hasil yang sama di tabel yang dipartisi? ERROR 1488 (HY000): Duplicate partition name myvertabelopart0 Itu menjatuhkannya dalam waktu kurang dari 0. 06 detik. Mari coba hapus semua data yang lebih lama dari 2016 ERROR 1488 (HY000): Duplicate partition name myvertabelopart_1 … dan kemudian menjatuhkan data yang setara dari tabel yang dipartisi ERROR 1488 (HY000): Duplicate partition name myvertabelopart_2 Lihatlah output untuk masing-masing ERROR 1488 (HY000): Duplicate partition name myvertabelopart3988644 baris terpengaruh56. 125 dtk ERROR 1488 (HY000): Duplicate partition name myvertabelopart_40 baris yang terpengaruh Catatan. 0 Duplikat. 0 Peringatan. 00. 047 dtk Seperti yang Anda lihat, proses menghapus data jauh lebih cepat ketika Anda memiliki partisi KesimpulanDari pengalaman pribadi, mempartisi adalah bagian terakhir dari setiap proses pengoptimalan yang akan saya lakukan. Saya akan melakukannya hanya setelah menghabiskan alternatif lain, seperti mengerjakan ulang kueri yang lambat. Secara umum, mempartisi paling masuk akal saat Anda berurusan dengan jutaan rekaman. Dalam hal ini, menurut saya CREATE TABLE userslogs ( id INT NOT NULL AUTO_INCREMENT, username VARCHAR(20) NOT NULL, logdata BLOB NOT NULL, created DATETIME NOT NULL, PRIMARY KEY(id), UNIQUE KEY (username, created) ) PARTITION BY HASH( TO_DAYS(created) ) PARTITIONS 10;_9 adalah yang paling berguna. Kasus penggunaan yang paling pas untuk CREATE TABLE userslogs ( id INT NOT NULL AUTO_INCREMENT, username VARCHAR(20) NOT NULL, logdata BLOB NOT NULL, created DATETIME NOT NULL, PRIMARY KEY(id), UNIQUE KEY (username, created) ) PARTITION BY HASH( TO_DAYS(created) ) PARTITIONS 10;9 adalah menghapus data deret waktu lama secara besar-besaran Sebelum Anda mengatur partisi apa pun, ingatlah bahwa partisi tersebut menerapkan beberapa batasan – cara pembuatan kunci unik dan primer; Apa yang Anda temukan dari bekerja dengan partisi di MySQL? Apakah MySQL5. 7 dukungan partisi oleh?MySQL 5. 7 tidak mendukung partisi vertikal , di mana kolom tabel yang berbeda ditetapkan ke partisi fisik yang berbeda. Tidak ada rencana saat ini untuk memperkenalkan partisi vertikal ke dalam MySQL.
Apakah MySQL5. 7 klausul dukungan?Derived Tables akan bekerja pada kedua MySQL 5. 7 dan MySQL 8, sedangkan klausa WITH tidak didukung di MySQL 5. 7 .
Apakah MySQL5. 6 mendukung partisi?Selain itu, MySQL 5. 6 mendukung pemilihan partisi eksplisit untuk kueri . Misalnya, SELECT * FROM t PARTITION (p0,p1) WHERE c < 5 hanya memilih baris di partisi p0 dan p1 yang cocok dengan kondisi WHERE.
Apakah MySQL mendukung partisi dengan?MySQL mendukung beberapa jenis partisi serta subpartisi ; . 2, “Jenis Partisi”, dan Bagian 22. 2. 6, "Subpartisi". Bagian 22. 3, “Manajemen Partisi”, mencakup metode penambahan, penghapusan, dan pengubahan partisi pada tabel partisi yang ada. Bagian 22. 3. |