Rumah >pangkalan data >tutorial mysql >Analisis mendalam tentang cara menyelesaikan masalah MySQL kehabisan ID auto-increment

Analisis mendalam tentang cara menyelesaikan masalah MySQL kehabisan ID auto-increment

WBOY
WBOYke hadapan
2022-06-02 11:45:292095semak imbas

Artikel ini membawa anda pengetahuan yang berkaitan tentang mysql, yang terutamanya memperkenalkan isu berkaitan tentang ID yang meningkat sendiri mempunyai had atas, ia akan sentiasa digunakan selesai, apakah yang perlu saya lakukan jika saya kehabisan ID. Mari kita lihat ini.

Analisis mendalam tentang cara menyelesaikan masalah MySQL kehabisan ID auto-increment

Pembelajaran yang disyorkan: tutorial video mysql

Saya baru-baru ini melihat soalan temu bual seperti ini. ID autokenaikan MySQL telah digunakan, apakah yang perlu saya lakukan? Berikut ialah penyelesaian kepada soalan temuduga ini.

Jika anda telah menggunakan atau memahami MySQL, maka anda mesti tahu tentang kunci utama penambahan automatik. Setiap ID penambahan automatik mempunyai nilai awal yang ditentukan, dan kemudian meningkat mengikut saiz langkah yang ditentukan (saiz langkah lalai ialah 1). Walaupun tiada had atas untuk nombor asli, apabila kami mereka bentuk struktur jadual, kami biasanya menentukan panjang medan, jadi ID mempunyai had atas pada masa ini. Memandangkan terdapat had atas, akan sentiasa ada masa apabila ia habis Bagaimana jika ID itu habis? Mari belajar bersama hari ini.

ID kenaikan automatik

Bercakap tentang id kenaikan automatik, saya percaya reaksi pertama anda mestilah menyesuaikan medan id kenaikan automatik semasa mereka bentuk struktur jadual. Apabila memasukkan data, mungkin terdapat perlanggaran kunci utama yang unik, rollback transaksi SQL, sisipan kelompok, aplikasi kelompok untuk nilai kenaikan automatik, dsb., yang menyebabkan ID kenaikan automatik tidak berterusan.

Logik nilai kenaikan automatik yang ditakrifkan dalam jadual selepas ia masuk dalam talian ialah: apabila memohon untuk ID seterusnya, nilai yang sama (nilai maksimum) akan diperolehi. Anda boleh memasukkan sql untuk menetapkan id kepada nilai maksimum, dan kemudian memasukkan pernyataan yang tidak secara aktif menetapkan id untuk mengesahkan kesimpulan ini. Jika anda memasukkan sekali lagi pada masa ini, konflik kunci utama akan dilaporkan ~

Berikut ialah peringatan: 232-1 (4294967295) bukan nombor yang sangat besar Untuk jadual yang kerap memasukkan dan memadam data, ia boleh digunakan Selesai. Oleh itu, semasa membina jadual, anda perlu menyemak sama ada jadual anda mungkin mencapai had atas ini Jika boleh, anda harus menciptanya sebagai bigint 8-bait yang tidak ditandatangani.

Sistem InnoDB secara automatik menambah row_id

Jika jadual InnoDB yang anda cipta tidak menyatakan kunci utama, InnoDB akan mencipta row_id yang tidak kelihatan dengan panjang 6 bait untuk anda. InnoDB mengekalkan nilai dict_sys.row_id global Untuk semua jadual InnoDB tanpa kunci utama, setiap kali baris data dimasukkan, nilai dict_sys.row_id semasa digunakan sebagai row_id data yang akan dimasukkan, dan kemudian nilai dict_sys. .row_id dinaikkan sebanyak 1.

Sebenarnya, apabila kod itu dilaksanakan, row_id ialah integer panjang yang tidak ditandatangani (bigint unsigned) dengan panjang 8 bait. Walau bagaimanapun, apabila InnoDB direka, hanya 6 bait panjang yang tinggal untuk row_id Dengan cara ini, hanya 6 bait terakhir diletakkan semasa menulis ke jadual data Oleh itu, terdapat dua nilai row_id yang boleh ditulis Jadual data. 48, Jika terdapat satu lagi tindakan memasukkan data, anda perlu memohon row_id Selepas mendapatkannya, 6 bait terakhir akan menjadi 0.

Walaupun nombor 2^48 sudah sangat besar, anda mesti tahu bahawa sistem boleh berjalan untuk masa yang lama, jadi masih boleh mencapai had atas pada masa ini, memohon semula akan menimpa rekod asal . Oleh itu, cuba untuk tidak memilih pilihan ini!

Xid

Apabila buat semula log dan binlog dalam MySQL digabungkan, mereka mempunyai medan biasa yang dipanggil Xid. Ia digunakan untuk sepadan dengan transaksi dalam MySQL.

MySQL mengekalkan pembolehubah global global_query_id secara dalaman Setiap kali pernyataan dilaksanakan, ia diberikan kepada Query_id, dan kemudian pembolehubah ini ditambah sebanyak 1. Jika penyata semasa ialah penyataan pertama yang dilaksanakan oleh transaksi ini, MySQL juga akan memberikan Query_id kepada Xid transaksi ini. Global_query_id ialah pembolehubah memori tulen dan akan dikosongkan selepas dimulakan semula. Oleh itu, dalam contoh pangkalan data yang sama, XID transaksi yang berbeza mungkin sama.

Innodb trx_id

InnoDB secara dalaman mengekalkan pembolehubah global max_trx_id Setiap kali trx_id baharu perlu digunakan, nilai semasa max_trx_id diperoleh, dan kemudian max_trx_id dinaikkan sebanyak 1.

Idea teras keterlihatan data InnoDB ialah: setiap baris data merekodkan trx_id yang mengemas kininya Apabila transaksi membaca baris data, cara untuk menentukan sama ada data itu boleh dilihat adalah melalui konsistensi transaksi Pandangan dibandingkan dengan trx_id baris data ini. Walau bagaimanapun, terdapat bacaan kotor dalam proses ini, jadi ID tidak akan menjadi atom dan terdapat kemungkinan pendua.

thread_id

Sebenarnya, thread id ialah id peningkatan diri yang paling biasa dalam MySQL. Biasanya apabila kita menyemak pelbagai adegan, lajur pertama dalam senarai proses rancangan ialah thread_id.

Logik thread_id mudah difahami: sistem menyimpan pembolehubah thread_id_counter global Setiap kali sambungan baharu dibuat, thread_id_counter ditetapkan kepada pembolehubah thread sambungan baharu ini.

Saiz thread_id_counter yang ditentukan ialah 4 bait, jadi apabila ia mencapai 232-1, ia ditetapkan semula kepada 0 dan terus meningkat. Hasilnya adalah sama seperti row_id, dan rekod asal akan ditimpa.

Perkara di atas memperkenalkan beberapa ID penambahan automatik MySQL sendiri Sebenarnya, dalam aplikasi sebenar, kami juga boleh memilih kunci utama penambahan automatik luaran dan kemudian mengekalkannya ke pangkalan data untuk menggantikan penambahan automatik pangkalan data itu sendiri. ID. Mari bercakap mengenainya di bawah.

Kunci utama peningkatan automatik Redis

Malah, terdapat banyak cara untuk menjana kunci utama peningkatan automatik luaran Mengapa saya perlu memperkenalkan redis? Kerana saya telah menemui banyak kelebihannya dalam aplikasi praktikal.

Redis itu sendiri adalah atom, jadi konkurensi tinggi juga selamat untuk benang. Dengan mengandaikan bahawa panjang medan kunci utama ialah 20, kami menggunakan masa sebagai nombor kenaikan automatik untuk membentuk kunci utama, contohnya: tarikh 8 digit dengan nombor kenaikan automatik 12 digit. Kemudian, mengikut sifat perniagaan, masa boleh ditentukan sebagai tahap tahun, bulan, hari atau milisaat Kemudian kebarangkalian untuk mengulangi nombor kenaikan automatik antara milisaat adalah sangat kecil, dan ia boleh digunakan untuk. perniagaan asas.

Ringkasan

Beberapa ID yang meningkat sendiri diperkenalkan di atas Setiap ID yang meningkat sendiri mempunyai senario aplikasinya sendiri, dan prestasinya selepas mencapai had atas juga berbeza:

1. Selepas id kenaikan automatik jadual mencapai had atas, nilainya tidak akan berubah apabila memohon semula, yang akan membawa kepada ralat konflik kunci utama apabila terus memasukkan data . > Xid hanya perlu tidak mempunyai nilai pendua dalam fail binlog yang sama. Walaupun nilai pendua secara teorinya akan muncul, kebarangkalian adalah sangat kecil dan boleh diabaikan
4 Nilai kenaikan max_trx_id InnoDB akan disimpan setiap kali MySQL dimulakan semula, jadi bacaan kotor yang disebutkan dalam artikel kami. Contohnya ialah pepijat yang mesti muncul Mujurlah, kami masih mempunyai banyak masa
5 thread_id adalah yang paling biasa kami gunakan, dan ia juga merupakan logik id kenaikan automatik yang dikendalikan dengan baik. .
6, redis kenaikan automatik luaran, tahap milisaat, secara teorinya akan terdapat nilai pendua, tetapi kebarangkaliannya sangat kecil dan boleh diabaikan
7, Dalam hakikatnya, setiap ID Meningkatkan Sendiri mempunyai senario terpakai mereka sendiri, dan anda boleh memilih mengikut senario tertentu dalam penggunaan harian. Tetapi bersedia untuk hari hujan, kerana masa berjalan sistem dan penyimpanan data mesti diambil kira, pilih satu yang tidak akan diulang serta-merta semasa operasi sistem. Adakah anda telah mempelajarinya?
Pembelajaran yang disyorkan: tutorial video mysql

Atas ialah kandungan terperinci Analisis mendalam tentang cara menyelesaikan masalah MySQL kehabisan ID auto-increment. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:csdn.net. Jika ada pelanggaran, sila hubungi admin@php.cn Padam