Kinerja Tinggi MySQL untuk Banyak SELECT / INSERT / UPDATEs / DELETEs


9

Saya membuat modul di mana setiap pengguna sering mendapatkan catatan ke dalam tabel selama 10 hingga 300 detik.

Ketika waktu kedaluwarsa, sebuah catatan dihapus. Kasusnya adalah: akan ada banyak pengguna dan catatan akan sangat sering berubah - bagaimana ini akan mempengaruhi kinerja aplikasi untuk tabel ini, karena catatan akan sangat sering berubah dan saya bertanya-tanya apakah mysql baik-baik saja dengan itu? Seperti indeks yang akan datang dan pergi, data berubah seperti 200 kali / detik untuk tabel khusus ini. Mungkin saya memilih solusi buruk untuk pekerjaan semacam ini. Ada saran?

Terima kasih!


2
Sudahkah Anda mencoba menyimpan data dalam memcache dan kemudian membukanya dalam satu transaksi setiap beberapa detik?

3
"perubahan data seperti 200 kali / detik untuk tabel khusus ini" Saya pikir garis menguraikan data ini harus disimpan dalam memori, masa hidup yang harus dilalui adalah kecil sehingga mungkin tidak boleh pergi ke disk?

Indeks datang dan pergi? Saya tidak bisa memikirkan alasan mengapa Anda perlu membuat dan menjatuhkan indeks sangat sering.
Barry Brown

Jawaban:


3

Satu hal yang harus dipertimbangkan adalah bagaimana MySQL menggunakan buffer untuk mesin penyimpan utamanya: InnoDB dan MyISAM .

Apa yang terletak di dalam memori sangat berbeda antara mesin penyimpanan ini.

InnoDB menyimpan data dan halaman indeks. Mereka dimuat ke dalam Pool Buffer InnoDB, yang berukuran oleh innodb_buffer_pool_size .

MyISAM hanya menyimpan halaman indeks dan mereka dimuat ke dalam Cache Kunci (Kunci Buffer), yang berukuran oleh key_buffer_size .

Anda harus menggunakan information_schema.tables untuk mendapatkan data dan ukuran indeks yang ditempati pada disk untuk ukuran Pool InnoDB Buffer dan MyISAM Key Cache dengan benar .

Bergantung pada seberapa banyak data yang Anda miliki dan berapa banyak waktu yang Anda izinkan, Anda bisa menghangatkan cache sebagai berikut:

Untuk setiap tabel, TableT

  • kebagian setiap indeks NDX
  • untuk setiap indeks NDX
    • Jalankan SELECT setiap kolom di NDX, setidaknya satu kolom tidak diindeks di TableT dari TableT

Dengan melakukan ini, Anda menjamin bahwa setiap halaman data dan indeks dibaca setidaknya sekali. Mereka akan duduk di cache. Konsep ini dipraktekkan, sebagian dan secara prinsip, oleh Percona . Percona membangun konsep ini menjadi mk-slave-prefetch . Apa yang dilakukan oleh program ini adalah

  • baca log relay pada slave di depan slave yang memproses SQL di dalamnya
  • mengambil pernyataan SQL dari log relai dan mengubahnya menjadi SELECT menggunakan klausa WHERE, GROUP BY, dan ORDER BY sebagai panduan untuk memilih indeks
  • jalankan pernyataan SELECT yang berasal dari SQL yang dikonversi

Ini memaksa budak untuk memiliki 99,99% dari data yang dibutuhkan oleh budak untuk memproses SQL dengan cepat. Ini juga membuat budak dipersiapkan jika Anda secara manual failover ke budak dan mempromosikannya ke master SIAPA CACHES HANYA TENTANG SAMA SEBAGAI MASTER YANG ANDA GAGAL LEBIH DARI.

KESIMPULAN

Tidak ada yang mengalahkan cache yang siap, mau, dan dapat Anda gunakan di lingkungan INSERTS, UPDATE, dan DELETE yang berat.

Cobalah !!!

CAVEAT

Dengan lahirnya produk-produk seperti memcached, beberapa telah menjauh dari kebutuhan untuk melakukan penyetelan MySQL yang benar. Memang, banyak situs mendapat manfaat dari peningkatan pengambilan data yang disediakan dengan mengendalikan perilaku caching data karena pengembang dengan cepat melihat dengan memcached. Banyak situs lain, hanya dengan mengganti mesin penyimpanan atau mengkonfigurasi MySQL dengan benar, telah menyadari manfaat kinerja yang sama. Sebelum menyerah pada basis data dan menggunakannya secara ketat sebagai repositori, manfaatkan sebagian besar basis data Anda. Ikuti uji tuntas dan Anda mungkin akan terkejut apa yang akan dilakukan MySQL untuk Anda.


5

Jika itu solusi yang buruk akan tergantung pada banyak hal. Apakah data ini harus persisten? Kalau tidak, mungkin solusi yang hanya menyimpan data ini dalam memori akan bekerja lebih baik.

"Banyak pengguna" tidak benar-benar membantu siapa pun. MySQL kemungkinan besar akan baik-baik saja jika "banyak" akan berarti beberapa ratus. (Meskipun tergantung pada apa lagi yang harus ditangani oleh database Anda. Beberapa ribu kemungkinan besar akan berfungsi juga.)

Lagi pula, tidak masalah, jika Anda menulis catatan itu untuk tetap atau menghapusnya setelah beberapa detik hingga beberapa menit. Menghapus hanya membuat dua operasi dari satu. Dan MySQL pasti bisa menangani jumlah yang sangat besar untuk membuat dan menghapus catatan. Pastikan Anda menggunakan indeks sederhana untuk menemukan catatan itu lagi untuk dihapus.

Tetapi tanpa angka aktual dan beberapa informasi tentang perangkat keras yang digunakan server database Anda, itu tidak dapat dijawab dengan sangat akurat.

Hal terbaik adalah menulis beberapa aplikasi kecil, yang hanya mensimulasikan jumlah beban yang Anda pikir akan Anda dapatkan tanpa melakukan banyak pemrosesan nyata, cukup masukkan banyak catatan ke server, hapus, pada tingkat yang sama jalankan beberapa pertanyaan seperti sisa program Anda akan menghasilkan. Lihatlah server Anda dan lihat, apakah itu memengaruhi dengan cara apa pun.

Tidak yakin, tetapi ada opsi untuk mengatur untuk MySQL yang akan memungkinkannya untuk me-cache tabel di memori sepenuhnya. Ini tetap melakukan ini dalam banyak situasi dan kemungkinan besar Anda tidak perlu banyak berubah. Tetapi jika Anda berbicara tentang jumlah pengguna dan catatan yang sangat besar, Anda mungkin dapat mengubah beberapa parameter untuk mengoptimalkan caching untuk kebutuhan khusus Anda.


4
+1 untuk menyarankan solusi yang menyimpan data dalam memori.

3

Ini ide gila . Ini melibatkan asumsi dan praktik yang tidak selalu disarankan (seperti memperbarui kunci) - Saya akan mendapatkan banyak negatif untuk menyarankan ini, tetapi ini dia ...

Dengan asumsi bahwa Anda memiliki volume baris yang sangat tinggi dan volume penghapusan yang tinggi, Anda dapat meningkatkan kinerja penghapusan dengan membuat 2 partisi di meja Anda. Partisi akan berbeda dengan digit pertama kunci. Contoh:

Nilai kunci 1123234441 adalah untuk baris aktif dan nilai kunci: 9123234441 adalah untuk baris tidak aktif (digit pertama dalam contoh ini digunakan sebagai berikut: 1 = aktif, 9 = tidak aktif).

Sekarang ketika pengguna menghapus baris, Anda tidak secara fisik menghapus baris, Anda memperbarui kunci (Aduh!), Ini akan secara otomatis memindahkan baris ke partisi baris tidak aktif.

Tentu saja, Anda perlu membatasi pilihan Anda untuk membaca data hanya dari partisi aktif. Sekarang bagian yang keren adalah bahwa menjatuhkan partisi baris yang tidak aktif sangat cepat.

Seperti yang saya katakan sebelumnya, ini berfungsi jika Anda hanya memiliki 1 meja. Saya belum menguji ini, jadi ini hanya pendekatan teoretis tetapi saya telah mengalami kecepatan penurunan partisi dan ini luar biasa cepat.

Untuk meningkatkan pilihan Anda, gunakan pengindeksan yang tepat dan untuk meningkatkan sisipan meminimalkan ukuran baris dan jumlah indeks (pernyataan ini sangat umum ...)

Untuk referensi, lihat: http://dev.mysql.com/doc/refman/5.1/en/partitioning-types.html Semoga ini bisa membantu.


2
Saya tidak yakin, apakah ini masuk akal untuk masalah khusus ini (Dugaan saya masih, bahwa mysql akan men-cache semuanya dan kemungkinan besar catatan itu tidak akan pernah melihat disk). Tapi +1 untuk menunjukkan teknik optimasi yang menarik yang saya tidak tahu sekarang.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.