InnoDB row id邊界溢位驗證

2021-09-23 23:29:36 字數 829 閱讀 8008

背景

跟同學聊到row_id乙個邊界問題,這裡詳細說明下。

innodb表若沒有定義主鍵,會使用系統的乙個預設遞增row_id (dict_sys->row_id)作為主鍵。每次插入一行加1,到達最大值迴圈復用。

需要注意的是,雖然dict_sys->row_id 被定義為乙個unsigned long long, 但由於這個主鍵值只有6個位元組,因此最大值是2^48。 row_id超過這個值還是會遞增,只是寫入的時候只取低位,可以認為是做取模操作。

問題

這就涉及到乙個問題,乙個長期執行的mysql裡,如果頻繁插入刪除行(像日誌類的表),即使最終表規模不是很大,仍可能會出現值row_id重用。而我們知道作為主鍵值,是不能重複的。

假設出現這種情況,在乙個表裡,新插入的一行的row_id與某乙個年代久遠的行的row_id出現衝突,會腫麼樣?

驗證

1)    建立一張無主鍵空表

2)   gdb設定dict_sys->row_id為1

3)  往空表插入若干行

4)   gdb設定dict_sys->row_id為2^48

5)   再插入若干行

6)   看結果

結論

可以看到,行(1),(2)被覆蓋了。

比較合理點的方案應該是像mysql的表內自增主鍵一樣,報個duplicate-key error.

InnoDB row id邊界溢位驗證

背景跟同學聊到 row id 乙個邊界問題,這裡詳細說明下。innodb 表若沒有定義主鍵,會使用系統的乙個預設遞增 row id dict sys row id 作為主鍵。每次插入一行加 1,到達最大值迴圈復用。需要注意的是,雖然 dict sys row id 被定義為乙個 unsigned l...

HTML CSS之邊界合併和邊界溢位

1.邊界合併只出現在塊級元素中,並且只會在上下邊距出現 2.塊級元素垂直上下邊距相遇,取較大的值 3.如果出現負邊距,這麼兩個元素的邊距就是上下邊距帶符號的和,如果負邊距的絕對值大於正邊距,就會出現重疊,後面的元素疊在前面的元素上 有上面的3點,下面我們就來一點一點的證明 1,2可以一起證明 正常情...

棧溢位,記憶體溢位

對於一台伺服器而言,每乙個使用者請求,都會產生乙個執行緒來處理這個請求,每乙個執行緒對應著乙個棧,棧會分配記憶體,此時如果請求過多,這時候記憶體不夠了,就會發生棧記憶體溢位。棧溢位是指不斷的呼叫方法,不斷的壓棧,最終超出了棧允許的棧深度,就會發生棧溢位,比如遞迴操作沒有終止,死迴圈。可以把記憶體比作...