penyisipan massal kueri mysql menyebabkan kesenjangan urutan

Saya memiliki pertanyaan untuk baris select dan insert dalam tabel dengan kolom kenaikan otomatis sebagai kuncinya.

insert into table a select * from table B

Saya menemukan bahwa setelah menjalankan kueri, ada celah urutan di kolom kenaikan otomatis di table B

Apakah itu mungkin? Atau pernyataan pilih saya gagal memasukkan beberapa catatan ??

Tolong bantu.

Saya tidak dapat mengulangi kasus ini karena ini adalah server produksi, dan saya tidak memiliki cadangan sebelum menjalankan kueri.

Terimakasih banyak.


person user2665145    schedule 08.08.2013    source sumber
comment
Saya yakin ini bisa terjadi jika Anda memutar kembali saat memasukkan. ( dev.mysql.com/doc/refman /5.1/en/ ) Anda mungkin melihat kesenjangan dalam urutan nilai yang ditetapkan ke kolom AUTO_INCREMENT jika Anda melakukan roll back transaksi yang telah menghasilkan angka menggunakan penghitung.   -  person SubSevn    schedule 08.08.2013


Jawaban (1)


Jika Anda menggunakan InnoDB dengan INSERT IGNORE, Anda mungkin ingin membaca artikel yang membahas masalah ini:

Menghindari penambahan otomatis lubang di InnoDB dengan INSERT IGNORE

Mengapa kita mempunyai kesenjangan?

InnoDB memeriksa penghitung kenaikan_otomatis pada tabel dan jika nilai baru diperlukan, menambah penghitung tersebut dan memberikan nilai baru ke kolom. Sebelum MySQL 5.1.22 InnoDB menggunakan metode untuk mengakses nilai penghitung yang disebut “Tradisional”. Yang ini menggunakan kunci tabel khusus yang disebut AUTO-INC yang tetap ada hingga akhir kueri atau transaksi. Oleh karena itu, dua kueri tidak dapat memiliki kunci AUTO-INC secara bersamaan, sehingga kita kehilangan konkurensi dan performa. Masalahnya bahkan lebih buruk dengan query yang berjalan lama seperti INSERT INTO table1 … SELECT … FROM table2.

Saat menggunakan sisipan sederhana dari pilihan, ada bug yang diketahui tentang ini

Sebagai kesimpulan, saya tidak akan mengatakan ini adalah masalah dengan kueri Anda, tetapi lebih terkait dengan cara mesin menangani penyisipan dari blok yang dipilih.

person Filipe Silva    schedule 08.08.2013
comment
Terima kasih. kueri saya hanya menyisipkan tanpa mengabaikan dan kueri dijalankan secara batch, tidak boleh ada kueri lain yang berjalan pada saat yang sama. Maaf, saya cukup baru di sql. - person user2665145; 08.08.2013
comment
Ada bug yang diketahui pada ini. Apakah Anda memiliki banyak insert from select? - person Filipe Silva; 08.08.2013