2011-11-24 19 views
6

我有一個網頁表,其中主鍵作爲URL的散列值,還有一個auto_increment ID列,它也是唯一鍵。如何確定MySQL自動增量步長

我有點困惑的是爲什麼連續插入不會將ID字段遞增1.當我第一次創建表並執行一次插入時,第一個ID是1.第二個插入生成並且id 5和第三個是8.

我有一個表上的觸發器,插入時,計算網頁的URL的散列。不知道這是否相關。

這不是有差距問題,但我想明白爲什麼連續插入不產生與1

感謝的步長的ID!

+0

你可以發佈觸發器的代碼嗎? –

回答

8

爲什麼這可能發生的幾點建議:

auto_increment_increment。這會在INSERT期間每次請求新值時控制增量。

另外,如果你在MySQL 5.1中使用InnoDB表,他們optimized auto-inc allocation,以便鎖定表的時間更短。這對於併發性很有用,但是如果行的INSERT與另一個約束(例如次UNIQUE列或外鍵)衝突,它也可能會「丟失」auto-inc值。在這些情況下,分配的auto-inc值不會被推回到隊列中,因爲我們假設另一個併發線程可能已經分配了下一個auto-inc值。

當然,還會發生回滾,在這種情況下,auto-inc值可能會被分配但被丟棄。

+0

謝謝比爾。我玩了更多,它看起來是重複的條目,導致差距(我的意思是試圖做一個重複的主鍵插入)。在重新抓取網頁(更新動態內容)時,這可能會留下不少差距。我想這不是一個大問題,只要我沒有用完整數值! :) –

+2

由於這個問題,我在今年早些時候做過一些諮詢,因爲這個網站的32位整數主鍵值不足。他們有一個次要的UNIQUE列,導致插入每1次成功失敗1000次。所以他們的auto-inc值增加了數百,而數量越多,他們擁有的行越多(重複的機會越多)。我們必須通過ALTER TABLE將它們的主鍵更改爲BIGINT(以及30+個依賴表中的外鍵列)。 –

+1

'SHOW SESSION VARIABLES;'查看auto_increment_increment的當前值 –

3

它可能與最終回滾的事務有關。例如,

  1. 插入google.com ID = 5
  2. 插入mysql.com ID = 6
  3. 插入stackoverflow.com ID = 7
  4. 回滾插入google.com
  5. 回滾插入的MySQL .com

然後stackoverflow.com插入id = 7和5和6留空。

1

自動增量始終爲1,但一旦刪除一行,ID就不會被釋放。

下一個自動遞增ID存儲在MySQL環境的信息模式數據庫中。它總是+1,當一行被移除時,它們之間的ID將會丟失。所以如果第一個是1,而第二個(根據你)是5,那麼2,3,4在這個過程中被刪除。

運行該查詢以查看,並在其中替換最後的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可以設置變化:

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

在一些配置(例如,對於主/主複製),a_i可以使用這些變量跳過數字。