Kenapa BUKAN partisi?

10

Kapan seseorang TIDAK ingin mempartisi basis data? (memikirkan partisi MySQL )

Dalam hal ini

  • Saya akan mulai dengan beberapa juta baris, itu harus tumbuh dari sana.
  • Kunci utama pada bidang karakter yang berfungsi sebagai penahan kueri yang paling sering (dan pencarian sering - setidaknya beberapa per detik).
  • Kunci primer akan hash untuk berfungsi sebagai kunci partisi
  • Pembaruan akan dilakukan untuk setiap baris yang ditarik dalam permintaan yang sering disebutkan di atas
  • Pencarian yang lebih jarang (terhadap kolom tanggal atau lainnya) perlu menekan semua partisi

Bahkan untuk poin terakhir, bukankah pencarian berjalan paralel sehingga dalam semua kasus, apakah ini sebuah kemenangan ? Apa kerugian untuk mempartisi? Mengapa ini bukan sesuatu yang SEMUA ORANG gunakan secara default, setidaknya ketika Anda melihat jutaan catatan?

PEMBARUAN - Saya memilih jawaban zgguy tetapi perhatikan bahwa saya menambahkan jawaban saya sendiri dengan hasil penelitian saya sendiri termasuk tautan ke jawaban yang sangat bagus pada pertanyaan serupa yang sangat berguna bagi saya.

chell
sumber

Jawaban:

5

Tidak ada peluru perak untuk masalah kinerja, dan partisi juga bukan satu.

Setiap partisi pada dasarnya adalah tabel untuk dirinya sendiri. Oleh karena itu pertanyaan yang ditulis dengan cara yang memungkinkan database untuk mencari baris hanya dalam satu partisi menjadi lebih cepat. Perbedaan bisa sangat besar untuk kueri yang perlu memindai seluruh tabel besar, tetapi dapat membatasi diri untuk memindai hanya satu partisi di tabel dipartisi. Untuk pencarian kunci yang unik, perbedaannya jauh lebih kecil.

Namun, kueri yang menggunakan pencarian indeks dengan cara yang membutuhkan database untuk mengunjungi semua atau sebagian besar tabel (indeks) partisi akan berjalan jauh lebih lambat.

Eksekusi paralel adalah topik untuk dirinya sendiri. Jika Anda menjalankan batch semalam yang besar, dan memiliki seluruh mesin untuk melakukan pekerjaan tunggal itu, maka paralelisasi adalah hal yang baik. Namun dalam sistem OLTP di mana database terus-menerus melayani permintaan dari banyak pengguna secara bersamaan, Anda tidak ingin satu pengguna mengambil semua sumber daya.

zgguy
sumber
Jadi pencarian kunci unik / primer tidak akan benar-benar melihat banyak (jika ada?) Peningkatan karena indeks PK lebih cepat? Apakah ini di seluruh papan - ada kalanya indeks PK lebih lambat? Bagaimana jika pencarian condong ke PK yang baru ditambahkan? Apakah partisi berdasarkan PK (saya pikir kunci partisi juga perlu modulus atau serupa dan BUKAN hash, kan?) Yang menyebabkan sebagian besar aktivitas untuk memukul hanya satu partisi akan membantu?
chell
Pencarian kunci primer / unik paling tidak akan melihat peningkatan kinerja kecil. Di sisi lain, jika tujuan Anda adalah untuk mengurangi pertikaian pernyataan DML, Anda harus mempartisi dengan cara sehingga DML tersebar secara merata di semua partisi alih-alih difokuskan pada beberapa di antaranya.
zgguy
maaf untuk kembali 10 hari kemudian, tetapi Anda meningkatkan poin kunci - Anda memberikan alasan yang bagus untuk melihat partisi mungkin tidak diperlukan, namun , skenario saya mencakup memperbarui setiap catatan setelah dibaca (beberapa per detik). Apakah kebutuhan untuk begitu banyak penulisan membuat kasus yang lebih meyakinkan untuk partisi (dengan distribusi yang merata) sehingga beban penulisan tersebar?
chell
Saya juga mencoba memahami komentar Anda tentang kueri yang mengenai banyak partisi (yang lebih lambat). Jika kueri menentang PK yang juga digunakan (hash) sebagai kunci partisi, bukankah DB segera tahu partisi mana yang akan digunakan berdasarkan hash pencarian? Terimakasih atas bantuannya!
chell
Maaf, akhir-akhir ini tidak dapat mengunjungi pertukaran tumpukan. Jawaban yang Anda tautkan sangat bagus. Saya percaya ini menjawab kedua pertanyaan Anda.
zgguy
2

Jawaban di sini ditulis dengan baik dan membuat argumen yang mirip dengan jawaban zgguy , bahwa partisi tidak banyak memberi Anda, jika ada, manfaat untuk skenario mesin tunggal di mana pencarian yang paling sering didasarkan pada kunci primer atau sesuatu yang serupa (karena pencarian yang diindeks harus sama cepat).

Faktanya, saran yang umum adalah bahwa alasan utama untuk mempartisi adalah tangensial dan sebagian besar terkait dengan manajemen: misalnya, pisahkan data Anda berdasarkan tanggal jika Anda perlu sering membersihkan catatan lama. Meskipun telah dicatat bahwa ini juga dapat menguntungkan kinerja pencarian Anda jika data Anda sedemikian rupa sehingga sebagian besar semua kueri hanya akan mencapai catatan yang baru ditambahkan.

Saya juga melihat menyebutkan bahwa MySQL tidak pernah melakukan apa pun secara paralel (akan menyenangkan untuk melihat beberapa tautan atau penjelasan lebih lanjut tentang itu).

Belum pernah ada yang berbicara apakah aktivitas menulis menambahkan pertimbangan yang berbeda atau tidak.

chell
sumber
Saya tidak berpikir menulis mengubah Jawaban Anda. Anda menyebutkan 2 dari 4 kasus penggunaan yang saya temukan. Masih tidak ada paralelisme, bahkan di 8.0.
Rick James
1

Hal pertama yang terlintas dalam pikiran adalah pemangkasan partisi ; jika itu bukan sesuatu pertanyaan Anda dapat digunakan.

Apakah Anda akan membutuhkan sejumlah besar data dari tabel sebagai partisi akan membantu Anda. Meskipun sudah tua tetapi posting dari Peter ini memiliki beberapa hal untuk dipertimbangkan.

dan satu hal lagi yang bisa dipikirkan adalah kemudahan penggunaan untuk tabel sederhana ... partisi membutuhkan kerja dan pemeliharaan tambahan.

mysql_user
sumber
Versi yang lebih baru memiliki sintaksis untuk secara eksplisit membatasi kueri ke partisi. Saya tidak bisa memikirkan alasan yang valid untuk menggunakan itu.
Rick James