1. 程式人生 > >資料庫自增主鍵可能產生的問題

資料庫自增主鍵可能產生的問題

在MySQL中經常會配置自增長屬性的欄位作為主鍵,特別是使用InnoDB儲存引擎,

因為InnoDB的聚集索引的特性,使用自增長屬性的欄位當主鍵效能更好,但是使用自增主鍵也可能會帶來一些問題。
舉個例子,使用自增主鍵對資料庫做分庫分表,可能出現一些諸如主鍵重複等的問題,或者在資料庫匯入的時候,可能會因為主鍵出現一些問題。

主要業務表的主鍵應該配置一個合理的策略,儘量避免自增AUTO_INCREMENT。

針對主鍵自增可能產生的問題,下面這兩篇文章有相關的討論:

>>針對主鍵增長方式的解決方案

(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....

相關推薦

資料庫可能產生的問題

在MySQL中經常會配置自增長屬性的欄位作為主鍵,特別是使用InnoDB儲存引擎, 因為InnoDB的聚集索引的特性,使用自增長屬性的欄位當主鍵效能更好,但是使用自增主鍵也可能會帶來一些問題。 舉個例子,使用自增主鍵對資料庫做分庫分表,可能出現一些諸如主鍵重複等的問題,

PK資料庫 聯合

主鍵:主鍵是用來幹嘛的?一般來說是為了建立唯一標識,建立索引的。 主鍵的使用目的: a.為了保證資料查詢唯一; b.提高儲存效率和索引效率。 索引:如果表的讀操作少或者沒有,索引效率會高,如果表的寫操作較多或者大量,建立索引會慢。 主鍵的設定方法有3種: 一種是設定自增長主鍵

【Mybatis】資料插入資料庫時,獲取

在mybatis的XML檔案時,配置useGeneratedKeys和KeyProperty屬性,且這兩個屬性不能省略。 useGeneratedKeys屬性,要求資料庫本身具備主鍵自動增長的功能。

使用mybatis插入ID的數據後返回的ID

配置 map batis 對象 insert語句 parameter 用戶註冊 class domain 在開發中碰到用戶註冊的功能需要用到用戶ID,但是用戶ID是數據庫自增生成的,這種情況上網查詢後使用下面的方式配置mybatis的insert語句可以解決: 1 <

INNODB的一些問題 vs mysql獲得字段下一個值

nod 天發 內存 ima dialog creat class 成對 例子 今天發現 批量插入下,自增主鍵不連續了。。。。。。。 InnoDB AUTO_INCREMENT Lock Modes This section describes

mysql建立的插入,及自動插入當前時間

user 解決方法 int value mysq src blog creat ecc MYSQL裏用這兩個字段,幾乎都是必須的。 以前都是自動建立的,現在手把手建立的時候,就要找資料來搞定了。 參考URL: http://blog.csdn.net/Weicleer

Mysql數據庫表的重新排列

mysql 主鍵 排列Mysql數據庫表的自增主鍵重新排列1,刪除原有主鍵:ALTER TABLE `表名` DROP `id`;2,添加新主鍵字段:ALTER TABLE `表名` ADD `id` MEDIUMINT( 8 ) NOT NULL FIRST;3,設置新主鍵:ALTER TABLE `表名`

如何獲取數據表中的值

兩個 包含 enc gpo into int acl sql emp 一、MySql數據庫   當向數據庫中插入一條數據的時候,默認是拿不到自增主鍵的值的, 需要設置如下兩個屬性才可以拿到主鍵值!   設置userGeneratedKeys屬性值為true:使用自動增長的主

MyCat

mycat全局序列號是MyCAT提供的一個新功能,為了實現分庫分表情況下,表的主鍵是全局唯一,而默認的MySQL的自增長主鍵無法滿足這個要求。全局序列號的語法符合標準SQL規範,其格式為:next value for MYCATSEQ_XXXMYCATSEQ_XXX 是序列號的名字,MyCAT自動創建新的序列

php處理ORACLE問題

post tp5 pdo 執行 pan 替換 class 自動 rom php和mysql不寫主鍵mysql可以自動生成主鍵; 想用pdo批量向mysql插入數據只能每條一個pdostarment->execute 看tp5.1的源碼提供的方案是 INSERT IN

Mybatis+Mysql插入數據庫返回id值的三種方法

文章 param mysql int sta source nbsp 通用 映射 一、場景: 插入數據庫的值需要立即得到返回的主鍵id進行下一步程序操作 二、解決方法: 第一種:使用通用mapper的插入方法 Mapper.insertSelective(r

EntityFramework實體默認值遇到Oracle

數據 默認值 max sta rem IT nextval clas ger 1. Oracle實現主鍵自動增長 一般我們在Oracle實現主鍵自動增長,通常通過序列加觸發器實現。 定義序列用於獲取遞增數字 CREATE SEQUENCE 序列名 [INCREMENT B

mybatis的執行流程 #{}和${} Mysql返回

ola save select .org 經驗 sel 占位符 upd 執行 n Mybatis配置 全局配置文件SqlMapConfig.xml,配置了Mybatis的運行環境等信息。 Mapper.xml文件即Sql映射文件,文件中配置了操作數據庫的Sql語句。此文件需

mybatis框架(6)---mybatis插入數據後獲取

-a 中間 generate 什麽 text 簡單 技術 cti 插入數據 mybatis插入數據後獲取自增主鍵 首先理解這就話的意思:就是在往數據庫表中插入一條數據的同時,返回該條數據在數據庫表中的自增主鍵值。 有什麽用呢,舉個例子: 你編輯

Oracle 建表sql+

ins acl declare reference 名稱 eas from execute arch -- 創建表 BONUS_BENCHMARK_VALUE ---------------------------------------------------------

JDBC插入表中一個數據返回其

Connection connection = JDBCUtils.getConnection(); //獲取一個連結 String sql ="insert into book values (null ,?)"; //資料庫book表中只有一個id自增跟書名欄位 PreparedSta

Mysql UUID做主及字串在插入、查詢,分頁等效能

1.插入方面 UUID做主鍵,其他欄位相同,插入100萬條資料,用了3.5個小時 自增主鍵,其他欄位相同,插入相同的100萬條資料,用了16分鐘 有序增長的字串做主鍵,其他欄位相同,插入相同100萬條資料,用了7分鐘 2.查詢方面 UUID做主鍵,select count() fro

Mybatis的mapper.xml檔案中插入資料返回

使用MyBatis往MySQL資料庫中插入一條記錄後,返回該條記錄的自增主鍵值。Mapper檔案應該怎麼寫呢? Mybatis的Mapper的標籤中有一個屬性,我們一起來看看: useGenerateKeys這個屬性,意思就是使用自增。我們需要將這個欄位設定為 true 。 同時,還需

mysql刪除

bsp modify 同時 類型 round mod color tab ext 在MySQL中刪除主鍵需要兩步.(1)如果有auto_increment,先刪除之;(2)刪除主鍵約束 primary key1、alter table t9 modify id int(11

mybatis獲取

自增很常用,各種資料庫也有點不一樣,再次來鞏固一下並記錄,以後可能用得到   以簡單的insert 為例 靈活易用,比較常見,增加selectKey  LAST_INSERT_ID()用於MySQL的自增主鍵,其中 id 為主鍵欄位,order表示在in