我有一個網頁表,其中主鍵作爲URL的散列值,還有一個auto_increment ID列,它也是唯一鍵。如何確定MySQL自動增量步長
我有點困惑的是爲什麼連續插入不會將ID字段遞增1.當我第一次創建表並執行一次插入時,第一個ID是1.第二個插入生成並且id 5和第三個是8.
我有一個表上的觸發器,插入時,計算網頁的URL的散列。不知道這是否相關。
這不是有差距問題,但我想明白爲什麼連續插入不產生與1
感謝的步長的ID!
我有一個網頁表,其中主鍵作爲URL的散列值,還有一個auto_increment ID列,它也是唯一鍵。如何確定MySQL自動增量步長
我有點困惑的是爲什麼連續插入不會將ID字段遞增1.當我第一次創建表並執行一次插入時,第一個ID是1.第二個插入生成並且id 5和第三個是8.
我有一個表上的觸發器,插入時,計算網頁的URL的散列。不知道這是否相關。
這不是有差距問題,但我想明白爲什麼連續插入不產生與1
感謝的步長的ID!
爲什麼這可能發生的幾點建議:
見auto_increment_increment。這會在INSERT期間每次請求新值時控制增量。
另外,如果你在MySQL 5.1中使用InnoDB表,他們optimized auto-inc allocation,以便鎖定表的時間更短。這對於併發性很有用,但是如果行的INSERT與另一個約束(例如次UNIQUE列或外鍵)衝突,它也可能會「丟失」auto-inc值。在這些情況下,分配的auto-inc值不會被推回到隊列中,因爲我們假設另一個併發線程可能已經分配了下一個auto-inc值。
當然,還會發生回滾,在這種情況下,auto-inc值可能會被分配但被丟棄。
謝謝比爾。我玩了更多,它看起來是重複的條目,導致差距(我的意思是試圖做一個重複的主鍵插入)。在重新抓取網頁(更新動態內容)時,這可能會留下不少差距。我想這不是一個大問題,只要我沒有用完整數值! :) –
由於這個問題,我在今年早些時候做過一些諮詢,因爲這個網站的32位整數主鍵值不足。他們有一個次要的UNIQUE列,導致插入每1次成功失敗1000次。所以他們的auto-inc值增加了數百,而數量越多,他們擁有的行越多(重複的機會越多)。我們必須通過ALTER TABLE將它們的主鍵更改爲BIGINT(以及30+個依賴表中的外鍵列)。 –
'SHOW SESSION VARIABLES;'查看auto_increment_increment的當前值 –
它可能與最終回滾的事務有關。例如,
然後stackoverflow.com插入id = 7和5和6留空。
自動增量始終爲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 >>'
mysql.cnf/INI可以設置變化:
auto-increment-increment = 2
auto-increment-offset = 1
在一些配置(例如,對於主/主複製),a_i可以使用這些變量跳過數字。
你可以發佈觸發器的代碼嗎? –