Otomatik artış neden eklenen satır sayısından daha fazla atlıyor?


11

auto_incrementSaklı bir yordam kullanarak toplu ekleme gerçekleştirdikten sonra bir Teklifler tablosunun bidID'sinde kaydedilen değeri gördüğüm bu garip davranış çok rahatsız :

INSERT INTO Bids (itemID, buyerID, bidPrice)
 SELECT itemID, rand_id(sellerID, user_last_id), FLOOR((1 + RAND())*askPrice)
 FROM Items
 WHERE closing BETWEEN NOW() AND NOW() + INTERVAL 1 WEEK ORDER BY RAND() LIMIT total_rows;

Örneğin, auto_incrementbidID değeri başlangıçta 101 ise ve 100 satır eklediysem, bitiş değeri 201 yerine 213 olur. Ancak, eklenen bu satırların bidID'leri sırayla en fazla 201 değerine kadar çalışır.

Aşağıdakileri kontrol ettikten sonra,

SHOW VARIABLES LIKE 'auto_inc%';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| auto_increment_increment | 1     |
| auto_increment_offset    | 1     |
+--------------------------+-------+

Neden olduğu hakkında hiçbir fikrim yok. Değerdeki sıçramaya ne sebep olabilir auto increment?


MyISAM veya InnoDB tabloları?
Cristian Porta

@CristianPorta, bu InnoDB.
Soru Taşması

show variables like '%innodb_autoinc_lock_mode%';Çıktınızı paylaşabilir misiniz ?
Cristian Porta

Tablo ile ilgili başka bir bağlantı / etkinlik olmadığından emin misiniz (satır ekleme)?
ypercubeᵀᴹ

1
@QuestionOverflow iyi bir başlangıç ​​noktası: dev.mysql.com/doc/refman/5.5/en/…
Cristian Porta

Yanıtlar:


10

Bu olağandışı değil ve birkaç nedeni var. Bazen, sorgu çalıştırıcısının karşı kaynakla ilgili çekişme sorunlarını azaltmak için yaptığı iyileştirmelerden dolayı etkilenen tabloda eşzamanlı güncellemeler olduğunda verimliliği artırır. Bazen, açıkça geri alınan (veya bir hatayla karşılaşma nedeniyle dolaylı olarak geri alınan) işlemlerden kaynaklanır.

Bir auto_incrementsütundan (veya IDENTITYMSSQL'de ve kavramın geçtiği diğer adlarda) tek garanti, her bir değerin benzersiz olması ve bir öncekinden daha küçük olmamasıdır: böylece sipariş değerlerine güvenebilirsiniz, ancak güvenemezsiniz. boşlukları olmamalı.

Hiç boşluk olmaması için sütunun değerlerine ihtiyacınız varsa, değerleri başka bir iş mantığı katmanında veya DB'de bir tetikleyici aracılığıyla yönetmeniz gerekir (yine de tetikleyicilerle ilgili olası performans sorunlarına dikkat edin) kendi rulo yapmak DB boşlukları izin vererek etrafındaki tüm eşzamanlılık / geri alma / temizleme sonra temizleme / diğer sorunları ile uğraşmak zorunda kalacak).


Bu davranışın tartışıldığı bazı referanslar verebilir misiniz?
Soru Taşması

1
Burada, SO ve genel olarak konuyla ilgili oldukça az referans var. "IDENTITY boşlukları", "auto_increment boşlukları" vb. İçin arama yapın ve bol miktarda tartışma bulmalısınız. Aramayı daha spesifik hale getirmek için DBMS adınızı ekleyebilirsiniz, ancak bu oldukça genel bir kavramdır, böylece ayrıntılı olarak nasıl çalıştığına dair başlık altına bakmadığınız sürece gerçek bir fark yaratmayabilir.
David Spillett

4
MySQL için ayrıntılara bakın: InnoDB'de işlem yapmaktan bahsettiği yerde: " Toplu ekler" için otomatik artış değerlerindeki boşluklar ... Kilit modları 1 veya 2 için, ardışık ifadeler arasında boşluklar oluşabilir çünkü toplu ifadeler tam sayıyı ekler her ifade için gerekli otomatik artış değerlerinin bilinmediği ve fazla tahmin yapılması mümkün olabilir. "
ypercubeᵀᴹ

@ ypercube, teşekkürler, bu size en çok yardımcı olanı.
Soru Taşması

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.