2011-11-24 18 views
6

私は、URLのハッシュとしてのプライマリキーと一意のキーであるauto_increment IDカラムを持つWebページのテーブルを持っています。MySQLのauto_incrementのステップサイズはどのように決定されますか

私がちょっと混乱しているのは、なぜ連続した挿入がIDフィールドを1つ増やさないのかということです。最初にテーブルを作成して1つの挿入を行ったとき、最初のIDは1でした。 5、3番目は8です。

私はテーブルに挿入して、ウェブページのURLのハッシュを計算するトリガーを持っています。それが適切かどうかはわかりません。

それはギャップを持っている問題ではないのですが、私は、連続挿入が1

感謝のステップサイズでIDを生成しない理由を理解したいと思います!

+0

トリガーのコードを投稿することはできますか? –

答えて

8

いくつかの提案:

auto_increment_incrementを参照してください。これは、INSERT中に新しい値が要求されるたびに増分を制御します。

また、MySQL 5.1でInnoDBテーブルを使用する場合は、テーブルをより短期間ロックするように、optimized auto-inc allocationを使用します。これは並行処理には適していますが、行のINSERTが2次UNIQUE列や外部キーなどの別の制約と競合する場合、auto-inc値を「失う」こともあります。そのような場合、割り当てられたauto-inc値はキューにプッシュバックされません。これは、別の同時スレッドがすでに次のauto-inc値を割り当てている可能性があるためです。

もちろん、ロールバックも発生します。この場合、auto-inc値が割り当てられても破棄される可能性があります。

+0

ありがとうございました。私はそれをもう少し周りに遊んだとそれは重複したエントリのように(それは私が重複した主キーで挿入を行うことを意味する)ギャップを引き起こすように見えます。ウェブページの再クロールを行うとき(動的コンテンツを更新するとき)、これはかなりのギャップを残すでしょう。私は整数値がなくなっていない限り、それは大きな問題ではないと思います! :) –

+2

この問題のために、32ビット整数プライマリキーの値が使い果たされたサイトについて、今年初めにコンサルティングを行った。彼らには、2回目のUNIQUE列があり、挿入が1回成功するたびに1000回失敗していました。だから彼らのauto-inc値は数百倍に増えていて、より多くの行にはより多くの行(重複の可能性)がありました。主キーをBIGINTに変更するには、ALTER TABLEを使用する必要がありました(30以上の従属テーブルの外部キー列と一緒に)。 –

+1

auto_increment_incrementの現在の値を見るには 'SHOW SESSION VARIABLES; ' –

3

トランザクションがロールバックされることに関連する可能性があります。例えば、

  1. 挿入google.com ID = 5
  2. 挿入mysql.comのID = 6
  3. 挿入stackoverflow.com ID = 7
  4. ロールバック挿入google.com
  5. ロールバックインサートのMySQL .com

次に、id = 7の場合はstackoverflow.comが挿入され、5と6は空白のままです。これが起こっされる理由の

1

自動増分は常に1のステップで行われますが、行が削除されるとIDは解放されません。

次の自動インクリメントIDは、MySQL環境の情報スキーマデータベースに格納されます。常に+1であり、行が削除されると、その間のIDは失われます。したがって、最初の値が1で、2番目の値が5の場合、2,3,4が削除されています。 (

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

いくつかの構成では:;

ファイル名を指定して実行を見つけると、どこで、最後の2つの値を置き換えるために、このクエリ)

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は、変更を設定することができますたとえば、マスター/マスターレプリケーションの場合)、a_iはこれらの変数を使用して数値をスキップできます。

関連する問題