Partisi MySQL: Apakah ada tradeoff kinerja antara jumlah partisi dan ukuran setiap partisi?

10

Saya memiliki meja besar (beberapa 100 juta baris) yang ingin saya partisi secara efisien. Pertanyaan saya adalah apakah ada tradeoff antara ukuran partisi dan jumlah partisi. Sejauh yang saya mengerti, sebagian besar kueri pada kolom yang digunakan dalam partisi akan lebih cepat karena kueri (untuk sebagian besar kueri) hanya perlu mencari di dalam partisi yang berlaku untuk kueri. Dengan demikian, akan masuk akal bahwa, untuk memaksimalkan efisiensi, Anda harus membagi tabel besar menjadi jumlah maksimum partisi, oleh karena itu, membuat setiap partisi sekecil mungkin. Dalam hal MySQL, ini berarti 1024 partisi. Tetapi apakah ada kelemahan kinerja untuk memiliki sejumlah besar partisi? Jadi, bagaimana cara menemukan jumlah partisi yang optimal?

Catatan: Sudah ada pertanyaan yang agak mirip pada stackoverflow , tetapi hanya satu jawaban, yang (dari sudut pandang saya) meleset dari sasaran. Jadi saya akan menyatakan pertanyaan dengan cara saya sendiri ... semoga lebih jelas

perampokan
sumber

Jawaban:

6

Mari kita bandingkan mereka

UKURAN PARTISI

Jika Anda memiliki yang berikut:

  • 100 juta baris dalam satu tabel
  • Pengindeksan BTREE
  • Setiap Halaman di BTREE memegang 1024 kunci

Akan seperti apa metrik itu?

Karena LOG (100000000) / LOG (2) = 26.575424759099, indeks BTREE dengan 1024 kunci per halaman treenode akan memiliki tinggi pohon hanya 3 (CEILING (LOG (100000000) / LOG (1024)))). Dengan hanya tiga halaman node, pencarian biner untuk kunci yang diperlukan di setiap treenode diakses akan menghasilkan pemangkasan dan isolasi sekitar 30 kunci.

JUMLAH PARTISI

Jika Anda memiliki yang berikut:

  • 100 juta baris dalam satu tabel
  • Pengindeksan BTREE
  • Setiap Halaman di BTREE memegang 1024 kunci
  • Anda membuat 1024 parititions

Jumlahnya akan sedikit berbeda.

Setiap partisi harus memiliki sekitar 97656 baris. Apa yang akan menjadi metrik sekarang?

Karena LOG (97656) / LOG (2) = 16.575421065795, indeks BTREE dengan 1024 kunci per halaman treenode akan memiliki tinggi pohon hanya 2 (CEILING (LOG (97656) / LOG (1024)))). Dengan hanya dua halaman node, pencarian biner untuk kunci yang diperlukan di setiap treenode diakses akan menghasilkan pemangkasan dan isolasi sekitar 20 kunci.

KESIMPULAN

Menyebarkan kunci hanya menghilangkan satu level pohon tetapi pada dasarnya menciptakan 1024 indeks. Pertanyaan tidak akan tahu bedanya. Waktu pencarian mungkin nominal paling baik untuk partisi. Namun, pastikan semua data aktif. Selain itu, Anda mungkin hanya memukul beberapa partisi, sedangkan partisi lain dengan data yang jarang diakses hanya menghabiskan ruang dan tidak pernah cukup sering diakses untuk membenarkan partisi . Anda mungkin memiliki metrik kinerja yang berbeda untuk khawatir tentang yang lebih terang-terangan (seperti defragmentasi internal di XFS , ext3 vs ext4, dll.) Anda juga perlu khawatir tentang mesin penyimpanan mana yang Anda gunakan karena:

  • Pengindeksan InnoDB akan sedikit berantakan dibandingkan dengan MyISAM karena harus mengelola indeks berkerumun
  • InnoDB melakukan penulisan ganda data dalam ibdata1 serta file log saat ini (ib_logfile0 atau ib_logfile1)
RolandoMySQLDBA
sumber
1
Terima kasih, RolandoMySQLDBA, ini sangat menarik. Apa yang saya pahami dari hal ini adalah bahwa mempartisi akan memiliki pengaruh positif yang kecil tetapi cukup besar pada kecepatan kueri, tetapi dapat memiliki efek negatif lainnya, seperti fragmentasi. Namun yang saya minati adalah bagaimana menentukan jumlah partisi yang optimal. Haruskah saya selalu menggunakan angka maksimum yang diperbolehkan (yaitu 1024), atau bisakah nomor lain menjadi kompromi yang bagus antara efek positif dan negatif? Atau apakah tidak mungkin untuk menganalisis optimasi semacam ini?
robguinness
BTW, artikel ini menunjukkan bahwa jawabannya sedikit lebih rumit: mysqlperformanceblog.com/2010/12/11/…
robguinness
Jawabannya bagus, tetapi tentang pencarian dengan kunci (atau bidang yang diindeks). Saya tidak punya banyak pengalaman dengan mempartisi, tetapi dari sudut pandang saya veiw berguna ketika Anda harus melakukan pemindaian tabel penuh. Dalam hal ini Anda hanya memindai beberapa partisi daripada seluruh tabel.
Cherry