為什麼要使用自增ID作為主鍵
1.從業務上來說
在設計資料庫時不需要費盡心思去考慮設定哪個欄位為主鍵。然後是這些欄位只是理論上是唯一的,例如使用圖書編號為主鍵,這個圖書編號只是理論上來說是唯一的,但實踐中可能會出現重複的 情況。所以還是設定一個與業務無關的自增ID作為主鍵,然後增加一個圖書編號的唯一性約束。
2.從技術上來說
如果表使用自增主鍵,那麼每次插入新的記錄,記錄就會順序新增到當前索引節點的後續位置,當一頁寫滿,就會自動開闢一個新的頁。 總的來說就是可以提高查詢和插入的效能。
對InnoDB來說
1: 主鍵索引既儲存索引值,又在葉子節點中儲存行的資料,也就是說資料檔案本身就是按照b+樹方式存放資料的。
2: 如果沒有定義主鍵,則會使用非空的UNIQUE鍵做主鍵 ; 如果沒有非空的UNIQUE鍵,則系統生成一個6位元組的rowid做主鍵;
聚簇索引中,N行形成一個頁(一頁通常大小為16K)。如果碰到不規則資料插入時,為了保持B+樹的平衡,會造成頻繁的頁分裂和頁旋轉,插入速度比較慢。所以聚簇索引的主鍵值應儘量是連續增長的值,而不是隨機值(不要用隨機字串或UUID)。
故對於InnoDB的主鍵,儘量用整型,而且是遞增的整型。這樣在儲存/查詢上都是非常高效的。
相關推薦
為什麼要使用自增ID作為主鍵
1.從業務上來說 在設計資料庫時不需要費盡心思去考慮設定哪個欄位為主鍵。然後是這些欄位只是理論上是唯一的,例如使用圖書編號為主鍵,這個圖書編號只是理論上來說是唯一的,但實踐中可能會出現重複的 情況。所以還是設定一個與業務無關的自增ID作為主鍵,然後增加一個圖書編號的唯一性約束。 2.從技術上
MySQL資料庫為什麼習慣用自增序列作為主鍵
對於這個問題需要從MySQL的索引以及儲存引擎談起: InnoDB的primary key為cluster index,除此之外,不能通過其他方式指定cluster index,如果InnoDB不指定primary key,InnoDB會找一個unique not null的field做clus
深入分析mysql為什麼不推薦使用uuid或者雪花id作為主鍵
前言:在mysql中設計表的時候,mysql官方推薦不要使用uuid或者不連續不重複的雪花id(long形且唯一),而是推薦連續自增的主鍵id,官方的推薦是auto_increment,那麼為什麼不建議採用uuid,使用uuid究竟有什麼壞處?本篇部落格我們就來分析這個問題,探討一下內部的原因。 本篇部落格的
MySQL 使用自增ID主鍵和UUID 作為主鍵的優劣比較具體過程(從百萬到千萬表記錄測試)
popu tis pack 方案 表數據 lock 進行 args ios ?測試緣由? 一個開發同事做了一個框架。裏面主鍵是uuid。我跟他建議說mysql不要用uuid用自增主鍵,自增主鍵效率高,他說不一定高,我說inn
MySQL 使用自增ID主鍵和UUID 作為主鍵的優劣比較詳細過程(500W單表)
一個開發同事做了一個框架,裡面主鍵是uuid,我跟他建議說mysql不要用uuid用自增主鍵,自增主鍵效率高,他說不一定高,我說innodb的索引特性導致了自增id做主鍵是效率最好的,為了說服他,所以準備做一個詳細的測試。 作為網際網路公司,一定有使用者表,而且使用
xorm插入數據庫後返回主鍵自增id
分享 utf8 mage span import bsp ima utf orm golang使用xorm連接數據庫後,插入結構體,無法返回自增主鍵id,飯後的主鍵id都是0。經過研究發現,如果給結構體id設置xorm tag,則會默認id為0,不會返回插入成功後的主鍵id
xorm插入資料庫後返回主鍵自增id
golang使用xorm連線資料庫後,插入結構體,無法返回自增主鍵id,飯後的主鍵id都是0。經過研究發現,如果給結構體id設定xorm tag,則會預設id為0,不會返回插入成功後的主鍵id。 xorm文件中如下描述 1 package main 2 3 import
mongodb使用-增刪改查、colleciton關聯、_id作為主鍵實現update
題記:最近在公司做的專案,基於SDN的開源專案OpenDaylight實現的,關於OpenDaylight這裡就不詳細描述,感覺最重要的就是odl的xxx.yang 檔案,這個檔案就是定義了controller和web的互動的資料結構。這篇主要是講下mongodb資料庫的操
自增ID算法snowflake(雪花)
ges gui python 訂單 解決 mage ans log pytho 在數據庫主鍵設計上,比較常見的方法是采用自增ID(1開始,每次加1)和生成GUID。生成GUID的方式雖然簡單,但是由於采用的是無意義的字符串,推測會在數據量增大時造成訪問過慢,在基礎互
MyBatis 批量插入獲取自增 id 問題解決
插入 lis foreach myba 如果 .cn bsp collect images 問題: 通過 MyBatis 進行批量插入時,如果我們想獲取插入對象所對應的主鍵 id,做法是直接在 <insert> 標簽中直接加入 useGeneratedKeys
轉:snowflake分布式自增ID算法
說明 簡單 進行 out 溢出 缺點 新的 alt -1 原文地址:http://www.cnblogs.com/relucent/p/4955340.html 概述 分布式系統中,有一些需要使用全局唯一ID的場景,這種時候為了防止ID沖突可以使用36位的UUID,但是UU
Mysql自增ID起始值修改
user ... str ble 類型 ebo bsp 無法 錯誤 在mysql中很多朋友都認為字段為AUTO_INCREMENT類型自增ID值是無法修改,其實這樣理解是錯誤的,下面介紹mysql自增ID的起始值修改與設置方法。通常的設置自增字段的方法:創建表格時添加:
設計 MySQL 數據表的時候一般都有一列為自增 ID,這樣設計原因是什麽,有什麽好處?
數據表 問題 innodb unique uuid 定義 記錄 原因 指向 知乎采集: MyISAM/InnoDB默認用B-Tree索引(可理解為"排好序的快速查找結構")。 InnoDB中,主索引文件上直接存放該行數據,稱為聚簇索引。次索引指向對主鍵的引用;MyISA
在oracle數據庫裏創建自增ID字段的步驟
語句 自增 msg default into ext with con ive CREATE TABLE ADVICE ( ID INT NOT NULL, ACTIVE INT DEFAULT 1 NOT NULL, TYPE INT NOT NULL,
Twitter的分布式自增ID算法snowflake (Java版)
開發 使用 ++ fin form 數據中心 mes protected mov 概述 分布式系統中,有一些需要使用全局唯一ID的場景,這種時候為了防止ID沖突可以使用36位的UUID,但是UUID有一些缺點,首先他相對比較長,另外UUID一般是無序的。 有些時候我們希
mysql自增id獲取
tables lec name mysql 數據錯亂 form bsp auto 高度 mysql自增id獲取 使用max函數:select max(id) from tablename 優點:使用方便快捷。 缺點:獲取的不是真正的自增id,是表中最大的Id,如果有
自增列導致主鍵重復
idt not null del add border -a 查看 -s 有記錄進行插入時,自增列產生的值就有可能與已有的記錄主鍵沖突,導致出錯。首先想辦法解決問題,通過人工調大自增列的值,保證大於表內已有的主鍵即可,調整後,導數據正常問題發生的前置條件: 1.
根據自增ID生成不重復序列號
如果 sub HR break ring http 長度 end 自增 網上看到一個例子,源地址:https://www.aliyun.com/jiaocheng/536419.html 借鑒修改一下 實現根據long類型的用戶ID生成6位隨機邀請碼,並且根據邀請碼能算出用
讀書筆記之sql server2012數據庫重啟後自增ID值跳躍1000的解決方法
sql server2012 數據庫 重啟跳躍1000 解決方法 今天遇到的問題是:讀書筆記之sql server2012數據庫重啟後自增ID值跳躍1000的難題,這個問題經過測試並沒有完全解決,非常遺憾!博客實戰:(讀後感http://www.simayi.net讀書筆記),專註於讀書筆記與
自增ID時如何插入ID
into table off 註意 entity 如何 裏的 字段名 xxx 自增ID時如何插入ID SET IDENTITY_INSERT TABLE_NAME ON; INSERT INTO TABLE_NAME(XXX, XXX,..., XXX) SELECT XX