2011-11-24 15 views
6

Ho una tabella di pagine Web, con la chiave primaria come hash dell'URL e una colonna ID autoincrement, che è anche una chiave univoca.Come è determinata la dimensione del passo auto_increment MySQL

Ciò di cui sono un po 'confuso è il motivo per cui gli inserimenti successivi non incrementano il campo ID di 1. Quando ho creato la tabella per la prima volta e fatto un singolo inserto, il primo id era 1. Il secondo inserto prodotto e id di 5 e il terzo era 8.

Ho un trigger sul tavolo che, al momento dell'introduzione, calcola l'hash dell'URL della pagina web. Non sono sicuro se sia rilevante o meno.

Non è un problema di avere lacune, ma vorrei capire perché inserti successivi non generano gli ID con un passo di 1.

grazie!

+0

puoi pubblicare il codice del trigger? –

risposta

8

Diversi suggerimenti di cui questo può accadere:

Vedi auto_increment_increment. Controlla l'incremento ogni volta che viene richiesto un nuovo valore durante INSERT.

Anche se si utilizzano le tabelle InnoDB in MySQL 5.1, sono optimized auto-inc allocation in modo che blocchi la tabella per una durata inferiore. Ciò è positivo per la concorrenza, ma può anche "perdere" i valori di autoincremento se INSERT di una riga è in conflitto con un altro vincolo come una colonna UNIQUE secondaria o una chiave esterna. In questi casi, il valore di autoincremento assegnato non viene reinserito nella coda, poiché si presume che un altro thread concorrente possa aver già assegnato il successivo valore di autoincremento.

Ovviamente si verificano anche arresti, nel qual caso un valore di autoincremento può essere assegnato ma scartato.

+0

Grazie Bill. Ho giocato un po 'di più con esso e sembra che siano le voci duplicate che causano gli spazi vuoti (con cui intendo il tentativo di fare un inserto con una chiave primaria duplicata). Quando si esegue una nuova ricerca di pagine Web (per aggiornare il contenuto dinamico), questo probabilmente lascerà alcune lacune. Suppongo che non sia un problema enorme finché non esaurisco i valori interi! :) –

+2

Ho fatto alcune consulenze all'inizio di quest'anno per un sito che ha esaurito i valori nella chiave primaria intera a 32 bit a causa di questo problema. Avevano una colonna UNIQUE secondaria che causava il fallimento degli inserimenti 1000 volte per ogni 1 successo. Quindi i loro valori di autoincrezione aumentavano di centinaia, e di più erano le righe che avevano (più possibilità di duplicati). Abbiamo dovuto ALTER TABLE per cambiare le loro chiavi primarie in BIGINT (insieme alle colonne chiave esterna in 30+ tabelle dipendenti). –

+1

'MOSTRA VARIABILI DI SESSIONE;' per vedere il valore corrente di auto_increment_increment –

3

Potrebbe essere correlato a transazioni che si concludono con il rollback. Ad esempio,

  1. Inserisci google.com id = 5
  2. Inserire mysql.com id = 6
  3. Inserire stackoverflow.com id = 7
  4. inserto ripristino google.com
  5. ripristino inserto mysql .com

Quindi stackoverflow.com viene inserito con id = 7 e 5 e 6 vengono lasciati vuoti.

1

L'incremento automatico è sempre con passaggi di 1, ma una volta che una riga viene rimossa, l'ID non viene liberato.

Il successivo ID di incremento automatico è memorizzato nel database dello schema di informazioni nel proprio ambiente MySQL. È sempre +1 e quando una riga viene rimossa, l'ID intermedio mancherà. Quindi se il primo è 1 e il secondo (secondo te) è 5, allora 2,3,4 sono stati rimossi nel processo.

eseguire la query per scoprire, e sostituire gli ultimi 2 valori in cui;)

SELECT AUTO_INCREMENT 
from `information_schema`.`TABLES` 
WHERE TABLE_NAME = '<<YOUR TABLE NAME HERE>>' AND 
     TABLE_SCHEMA = '<< YOUR DATABASE NAME HERE >>' 
1

mysql.cnf/ini possibile impostare il cambio:

auto-increment-increment = 2 
auto-increment-offset = 1 

In alcune configurazioni (ad esempio, per la replica master/master), a_i può saltare i numeri usando queste variabili.

Problemi correlati