在mysql中經常會配置自增長屬性的字段作為主鍵,特別是使用innodb儲存引擎,
因為innodb的聚集索引的特性,使用自增長屬性的字段當主鍵效能更好,但是使用自增主鍵也可能會帶來一些問題。
舉個例子,使用自增主鍵對資料庫做分庫分表,可能出現一些諸如主鍵重複等的問題,或者在資料庫匯入的時候,可能會因為主鍵出現一些問題。
主要業務表的主鍵應該配置乙個合理的策略,盡量避免自增auto_increment。
innodb自增主鍵的一些問題
mysql自增列導致主鍵重複問題分析
來自知乎問題-高併發**如何解決資料庫主鍵自增的時候出現重複?
(1)設定主鍵自增為何不可取
這樣的話,資料庫本身是單點,不可拆庫,因為id會重複。
(2)依賴資料庫自增機制達到全域性id唯一
使用如下語句:
replace into tickets64 (stub) values ('a');
select last_insert_id();
這樣可以保證全域性id唯一,但這個tickets64表依舊是個單點。
(3)依賴資料庫自增機制達到全域性id唯一並消除單點
在2的基礎上,部署兩個(多個)資料庫例項,
設定自增步長為2(多個則為例項數),即auto-increment-increment = 2
設定auto-increment-offset分別為1,2.....
這樣第一台資料庫伺服器的自增id為 1 3 5 7 9
第二台為2 4 6 8 10
(4)解決每次請求全域性id都讀庫寫庫壓力過大的問題
比如第一次啟動業務服務,會請求乙個唯一id為3559
如果是2、3的方法,則id為3559,這樣每次都請求資料庫,對資料庫壓力比較大
可以用3559 * 65536(舉個例子,並不一定是65536)+ 記憶體自增變數來作為id
當記憶體自增變數到達65535時,從資料庫重新獲取乙個自增id
這樣即使有多台業務伺服器,id也不會重複:
第一台 3559 * 65536 + 1,2,3.....65535
第二台 3560 * 65536 + 1,2,3.....65535
然後第一台到65535了,換乙個資料庫自增id,這時候可能是3561 * 65536 + 1,2,3....
資料庫自增主鍵可能產生的問題
原文 原文 筆記 資料庫自增id會造成分布式資料庫不一致的問題 方案1 每個表自增步長不是1,比如第乙個表自增為初始為1,步長2,第二個表初始2,步長2 方案2 每個表起始不一樣,每增加到一定程度,重新選取起始值,如初始起始值為0 65535,自增為1,當增加到65535時,換個起始為1 65535...
資料庫自增主鍵的問題
刪除原表資料 並重置自增列,對於有外來鍵的資料 truncate 無法刪除 truncate table tablename 只刪除資料,標識值不清除 delete from tablename 設定允許顯式插入自增列 set identity insert tablename on 設定不允許顯式...
Oracle資料庫主鍵自增
在學習mysql時,我們很容易通過auto increment就能實現主鍵自增的功能,但是在oracle資料庫中,是沒有這個關鍵字的,所以也不能通過這樣來實現主鍵自增。下面我就為大家介紹兩種實現主鍵自增的方法。兩種方法的基礎都有乙個概念就是序列 sequence 的概念,一種是利用序列和顯式呼叫的方...