Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana menangani kunci asing saat mempartisi

Baca:Batasan Partisi MySQL

1.) FK tidak didukung pada tabel yang dipartisi.

  • Salah satu opsi adalah membuat prosedur tersimpan yang menyisipkan/memperbarui catatan dan memverifikasi di dalam prosedur bahwa id pengguna yang diteruskan ada di tabel pengguna Anda sebelum penyisipan dilakukan. Anda harus mengatur izin pada tabel sehingga hanya SP yang diizinkan untuk memperbarui dan menyisipkan untuk mengizinkan aplikasi dan/atau pengguna dari pintu belakang pemeriksaan. Anda juga perlu mengambil tindakan pencegahan saat menghapus pengguna dari tabel pengguna.

2.) Kolom mana yang Anda gunakan untuk mempartisi akan bergantung pada cara Anda mengakses tabel. Jika kueri Anda selalu didasarkan pada nomor kendaraan, maka mungkin masuk akal untuk melakukan partisi hash pada kolom itu. Jika Anda menanyakan atau melaporkan lebih banyak tentang sesuatu seperti "kendaraan apa yang telah ditambahkan bulan ini" atau Anda ingin "meluncurkan" partisi saat mereka mencapai usia tertentu, maka mempartisi pada tanggal mungkin merupakan cara yang tepat. Ini adalah sesuatu yang harus Anda putuskan berdasarkan penggunaan Anda.

3.) Lihat tautan di atas untuk informasi lebih lanjut.

Edit berdasarkan pertanyaan pengguna:

Memasukkan catatan setiap 3 detik bukanlah banyak throughput. Pastikan Anda memiliki kunci utama di tabel pengguna Anda agar pemeriksaan di dalam prosedur dilakukan secara efisien. (Ini benar bahkan jika FK didukung) DB akan melakukan pemeriksaan ini untuk Anda di belakang layar jika Anda memiliki dukungan untuk FK jadi dalam hal itu, itu tidak merugikan Anda. Jika pemeriksaan akhirnya menjadi hambatan, Anda mungkin merasa perlu untuk menjatuhkannya dan mungkin melaporkan id pengguna yang salah sebagai proses batch setiap malam, tetapi jika tabel pengguna Anda relatif kecil dan diindeks dengan benar, saya tidak melihat ini sebagai masalah.

Pilihan lain adalah melakukan partisi secara manual (yaitu sharding) dengan tabel yang dipartisi atau tidak dipartisi. Dengan tabel yang tidak dipartisi tentu saja, Anda dapat menggunakan kunci asing asli. Misalnya Anda akan membagi tabel kendaraan menjadi beberapa tabel seperti:(dengan asumsi Anda ingin menggunakan vehicleNo sebagai "kunci")

KendaraanNosLessThan1000

KendaraanNosLessThan2000

KendaraanTidakKurangDari...

KendaraanNosLessThanMAX

Di sini Anda mungkin ingin memiliki SP lagi sehingga aplikasi/pengguna tidak perlu tahu tentang tabel. SP akan bertanggung jawab untuk memasukkan/memperbarui tabel yang benar berdasarkan vehicleNo yang dilewatkan. Anda juga ingin SP untuk memilih data sehingga aplikasi/pengguna tidak perlu mengetahui tabel untuk memilih keduanya. Untuk akses mudah ke semua data, Anda dapat membuat tampilan yang menyatukan semua tabel.

Perhatikan bahwa salah satu manfaatnya adalah saat ini MyISAM mengunci seluruh tabel yang dipartisi selama pembaruan, bukan hanya partisi yang diperbarui. Membagi tabel dengan cara ini meredakan pertengkaran itu karena tabel itu sendiri adalah "partisi".

Berdasarkan data terbatas yang saya miliki tentang apa yang Anda lakukan, saya mungkin akan menulis 2 prosedur tersimpan, 1 untuk memilih data dan 1 untuk memperbarui/memasukkan data dan meminta aplikasi Anda menggunakannya untuk semua akses. Kemudian saya akan mencoba partisi biasa melalui hash pada vehicleNo terlebih dahulu sambil menerapkan kunci user_id dalam prosedur. Jika ini menjadi masalah, Anda dapat dengan mudah bermigrasi ke sharding data di beberapa tabel tanpa harus mengubah aplikasi karena semua logika tentang cara mengambil dan memperbarui data terkandung dalam SP.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ReplicationManager memberikan pengecualian saat membuka koneksi

  2. Menggunakan MySQL di Flask

  3. Bagaimana saya bisa memfilter kueri berdasarkan porsi jam bidang DateTime di MySQL?

  4. mysql_connect (localhost / 127.0.0.1) lambat pada platform Windows

  5. Cara mengatur max_connections di MySQL Secara Terprogram