Cara menyelesaikan ralat MySQL: bilangan kunci melebihi saiz jadual kunci, contoh kod khusus diperlukan
Apabila menggunakan MySQL untuk operasi data, kami Pelbagai mesej ralat sering ditemui. Salah satunya ialah "Jumlah kunci melebihi saiz meja kunci", bermakna bilangan kunci melebihi saiz meja kunci. Jadi apa yang menyebabkan ralat ini dan bagaimana untuk menyelesaikannya?
Pertama sekali, mari kita fahami mekanisme penguncian dalam MySQL. MySQL menggunakan pelbagai jenis kunci untuk mengawal capaian dan pengubahsuaian data dalam pangkalan data. Mengikut skop kunci, kunci boleh dibahagikan kepada kunci peringkat meja dan kunci peringkat baris. Kunci peringkat jadual mengunci seluruh jadual, manakala kunci peringkat baris mengunci satu atau lebih baris dalam jadual.
Apabila berbilang transaksi melakukan operasi serentak pada masa yang sama, konflik kunci akan berlaku. Apabila transaksi perlu memperoleh kunci untuk mengakses data, jika kunci itu diduduki oleh transaksi lain, penantian akan berlaku. Apabila bilangan transaksi menunggu melebihi saiz jadual kunci yang ditakrifkan dalam MySQL, ralat "Jumlah bilangan kunci melebihi saiz jadual kunci" akan berlaku.
Untuk menyelesaikan ralat ini, terdapat beberapa kaedah:
Anda boleh lulus Ubah suai fail konfigurasi dalam MySQL untuk meningkatkan saiz jadual kunci. Buka fail konfigurasi MySQL my.cnf dan tambahkan konfigurasi berikut di bawah [mysqld]:
lock-tables = <value>
Antaranya,
Kadangkala, konflik kunci disebabkan oleh pengoptimuman pernyataan pertanyaan yang tidak mencukupi. Anda boleh mengetahui kawasan yang memerlukan pengoptimuman dengan menyemak pelan pelaksanaan pernyataan pertanyaan. Anda boleh menggunakan kata kunci EXPLAIN yang disediakan oleh MySQL untuk melihat pelan pelaksanaan pernyataan pertanyaan.
Sebagai contoh, jika pernyataan pertanyaan anda serupa dengan:
SELECT * FROM table WHERE column = <value> FOR UPDATE;
Anda boleh cuba menukarnya kepada:
SELECT * FROM table WHERE column = <value>;
Ini boleh mengelak daripada menjalankan keseluruhan penguncian meja.
Tahap pengasingan transaksi dalam MySQL dibahagikan kepada baca tidak komited dan baca komited ), boleh dibaca berulang (boleh dibaca berulang) dan boleh bersiri (serializable). Tahap pengasingan yang lebih tinggi menyebabkan saiz meja kunci meningkat.
Jika aplikasi anda tidak mempunyai keperluan yang tinggi untuk ketekalan data, anda boleh cuba menurunkan tahap pengasingan transaksi. Anda boleh menetapkan tahap pengasingan untuk membaca dilakukan dengan menggunakan pernyataan berikut:
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
Ini boleh mengurangkan kebarangkalian konflik kunci.
Jika logik perniagaan anda memerlukan operasi transaksi yang besar, sejumlah besar kunci mungkin dihasilkan. Anda boleh cuba membahagikan transaksi besar kepada berbilang transaksi kecil untuk mengurangkan kebarangkalian konflik kunci.
Di atas adalah beberapa penyelesaian biasa Anda boleh memilih kaedah yang sesuai dengan anda mengikut situasi tertentu. Di bawah ini kami menggunakan contoh kod untuk menunjukkan cara menyelesaikan ralat ini.
Andaikan pernyataan pertanyaan berikut muncul dalam kod anda:
cursor.execute("SELECT * FROM table WHERE column = %s FOR UPDATE", (value,))
Anda boleh menukarnya kepada:
cursor.execute("SELECT * FROM table WHERE column = %s", (value,))
Dengan cara ini anda boleh mengelakkan pertanyaan keseluruhan meja dikunci.
Ringkasnya, apabila MySQL melaporkan ralat "Jumlah bilangan kunci melebihi saiz jadual kunci", kami boleh meningkatkan saiz jadual kunci, mengoptimumkan pernyataan pertanyaan, menurunkan tahap pengasingan transaksi dan mengurai besar urus niaga dan kaedah lain untuk menyelesaikan masalah. Sudah tentu, penyelesaian khusus perlu ditentukan berdasarkan situasi sebenar. Harap artikel ini dapat membantu anda menyelesaikan masalah ini.
Atas ialah kandungan terperinci Jumlah bilangan kunci melebihi saiz jadual kunci - Cara menyelesaikan ralat MySQL: Bilangan kunci melebihi saiz jadual kunci. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!