最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關(guān)于mysql自增id,你需要知道的

 更新時間:2020年08月11日 10:52:40   作者:MySQL技術(shù)  
這篇文章主要介紹了關(guān)于mysql自增id的相關(guān)資料,幫助大家更好的理解和學習mysql,感興趣的朋友可以了解下

導讀:在使用MySQL建表時,我們通常會創(chuàng)建一個自增字段(AUTO_INCREMENT),并以此字段作為主鍵。本篇文章將以問答的形式講述關(guān)于自增id的一切。

注: 本文所講的都是基于Innodb存儲引擎。

1.MySQL為什么建議將自增列id設(shè)為主鍵?

  • 如果我們定義了主鍵(PRIMARY KEY),那么InnoDB會選擇主鍵作為聚集索引、如果沒有顯式定義主鍵,則InnoDB會選擇第一個不包含有NULL值的唯一索引作為主鍵索引、如果也沒有這樣的唯一索引,則InnoDB會選擇內(nèi)置6字節(jié)長的ROWID作為隱含的聚集索引(ROWID隨著行記錄的寫入而主鍵遞增,這個ROWID不像ORACLE的ROWID那樣可引用,是隱含的)。
  • 數(shù)據(jù)記錄本身被存于主索引(一顆B+Tree)的葉子節(jié)點上。這就要求同一個葉子節(jié)點內(nèi)(大小為一個內(nèi)存頁或磁盤頁)的各條數(shù)據(jù)記錄按主鍵順序存放,因此每當有一條新的記錄插入時,MySQL會根據(jù)其主鍵將其插入適當?shù)墓?jié)點和位置,如果頁面達到裝載因子(InnoDB默認為15/16),則開辟一個新的頁(節(jié)點)
  • 如果表使用自增主鍵,那么每次插入新的記錄,記錄就會順序添加到當前索引節(jié)點的后續(xù)位置,當一頁寫滿,就會自動開辟一個新的頁
  • 如果使用非自增主鍵(如果身份證號或?qū)W號等),由于每次插入主鍵的值近似于隨機,因此每次新紀錄都要被插到現(xiàn)有索引頁得中間某個位置,此時MySQL不得不為了將新記錄插到合適位置而移動數(shù)據(jù),甚至目標頁面可能已經(jīng)被回寫到磁盤上而從緩存中清掉,此時又要從磁盤上讀回來,這增加了很多開銷,同時頻繁的移動、分頁操作造成了大量的碎片,得到了不夠緊湊的索引結(jié)構(gòu),后續(xù)不得不通過OPTIMIZE TABLE來重建表并優(yōu)化填充頁面。

綜上而言:當我們使用自增列作為主鍵時,存取效率是最高的。

2.自增列id一定是連續(xù)的嗎?

自增id是增長的 不一定連續(xù)。

我們先來看下MySQL 對自增值的保存策略:

InnoDB 引擎的自增值,其實是保存在了內(nèi)存里,并且到了 MySQL 8.0 版本后,才有了“自增值持久化”的能力,也就是才實現(xiàn)了“如果發(fā)生重啟,表的自增值可以恢復為 MySQL 重啟前的值”,具體情況是:
在 MySQL 5.7 及之前的版本,自增值保存在內(nèi)存里,并沒有持久化。每次重啟后,第一次打開表的時候,都會去找自增值的最大值 max(id),然后將 max(id)+1 作為這個表當前的自增值。
舉例來說,如果一個表當前數(shù)據(jù)行里最大的 id 是 10,AUTO_INCREMENT=11。這時候,我們刪除 id=10 的行,AUTO_INCREMENT 還是 11。但如果馬上重啟實例,重啟后這個表的 AUTO_INCREMENT 就會變成 10。
也就是說,MySQL 重啟可能會修改一個表的 AUTO_INCREMENT 的值。
在 MySQL 8.0 版本,將自增值的變更記錄在了 redo log 中,重啟的時候依靠 redo log 恢復重啟之前的值。

造成自增id不連續(xù)的情況可能有:

  • 1.唯一鍵沖突
  • 2.事務(wù)回滾
  • 3.insert ... select語句批量申請自增id

3.自增id有上限嗎?

自增id是整型字段,我們常用int類型來定義增長id,而int類型有上限 即增長id也是有上限的。

下表列舉下 int 與 bigint 字段類型的范圍:

類型 大小 范圍(有符號) 范圍(無符號)
int 4字節(jié) (-2147483648,2147483647) (0,4294967295)
bigint 8字節(jié) (-9223372036854775808,9223372036854775807) (0,18446744073709551615)

從上表可以看出:當自增字段使用int有符號類型時,最大可達2147483647即21億多;使用int無符號類型時,最大可達4294967295即42億多。當然bigint能表示的范圍更大。

下面我們測試下當自增id達到最大時再次插入數(shù)據(jù)會怎么樣:

create table t(id int unsigned auto_increment primary key) auto_increment=4294967295;insert into t values(null);// 成功插入一行 4294967295show create table t;/* CREATE TABLE `t` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=4294967295;*/
insert into t values(null);//Duplicate entry '4294967295' for key 'PRIMARY'

從實驗可以看出,當自增id達到最大時將無法擴展,第一個 insert 語句插入數(shù)據(jù)成功后,這個表的AUTO_INCREMENT 沒有改變(還是 4294967295),就導致了第二個 insert 語句又拿到相同的自增 id 值,再試圖執(zhí)行插入語句,報主鍵沖突錯誤。

4.關(guān)于自增列 我們該怎么維護?

維護方面主要提供以下2點建議:

  • 1.字段類型選擇方面:推薦使用int無符號類型,若可預測該表數(shù)據(jù)量將非常大 可改用bigint無符號類型。
  • 2.多關(guān)注大表的自增值,防止發(fā)生主鍵溢出情況。

以上就是關(guān)于mysql自增id,你需要知道的的詳細內(nèi)容,更多關(guān)于mysql自增id的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • mysql如何將表結(jié)構(gòu)導出到excel

    mysql如何將表結(jié)構(gòu)導出到excel

    這篇文章主要介紹了mysql如何將表結(jié)構(gòu)導出到excel,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫,感興趣的朋友可以了解下
    2020-09-09
  • mysql主從及遇到的問題解決

    mysql主從及遇到的問題解決

    本文詳細介紹了如何使用Docker配置MySQL主從復制,首先創(chuàng)建了兩個文件夾并分別配置了`my.cnf`文件,通過執(zhí)行腳本啟動容器并配置好主從關(guān)系,文中還提到了一些常見問題的解決方法,如配置路徑錯誤導致的沖突和slave的change連接錯誤
    2025-01-01
  • 安裝mysql8.0.11及修改root密碼、連接navicat for mysql的思路詳解

    安裝mysql8.0.11及修改root密碼、連接navicat for mysql的思路詳解

    這篇文章主要介紹了安裝mysql8.0.11以及修改root密碼、連接navicat for mysql,需要的朋友可以參考下
    2018-06-06
  • mysql 無法連接問題的定位和修復過程分享

    mysql 無法連接問題的定位和修復過程分享

    開發(fā)的一款網(wǎng)站防護產(chǎn)品中出現(xiàn)了一個客戶端上安裝后Mysql每隔一段時間就出現(xiàn)問題,這個問題是客戶反饋的,所以需要去復現(xiàn)和定位
    2013-03-03
  • Win7下mysql5.5安裝圖文教程

    Win7下mysql5.5安裝圖文教程

    這篇文章主要為大家詳細介紹了Win7下mysql5.5安裝的圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • mysql函數(shù)split功能實現(xiàn)

    mysql函數(shù)split功能實現(xiàn)

    mysql 5.* 的版本現(xiàn)在沒有split 函數(shù),但有些地方會用,在這里就簡單記錄一下
    2012-09-09
  • mysql8.0無法使用group by的問題及解決

    mysql8.0無法使用group by的問題及解決

    這篇文章主要介紹了mysql8.0無法使用group by的問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • Mysql如何解決死鎖問題

    Mysql如何解決死鎖問題

    這篇文章主要介紹了Mysql如何解決死鎖問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • 關(guān)于com.mysql.jdbc.Driver與com.mysql.cj.jdbc.Driver的區(qū)別

    關(guān)于com.mysql.jdbc.Driver與com.mysql.cj.jdbc.Driver的區(qū)別

    這篇文章主要介紹了關(guān)于com.mysql.jdbc.Driver與com.mysql.cj.jdbc.Driver的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • MySQL中幾種常見的嵌套查詢詳解

    MySQL中幾種常見的嵌套查詢詳解

    最近在MySQL上做了點工作,發(fā)現(xiàn)很多人都在詢問MySQL嵌套查詢的問題,下面這篇文章主要給大家介紹了關(guān)于MySQL中幾種常見的嵌套查詢,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-08-08

最新評論

龙川县| 贡觉县| 沾化县| 辽阳市| 邯郸市| 新宁县| 涿州市| 二手房| 青岛市| 雅江县| 抚顺市| 寻乌县| 长宁县| 鞍山市| 锦州市| 彰化县| 密云县| 饶河县| 灵川县| 凤庆县| 汉中市| 武隆县| 涟水县| 稷山县| 台中县| 苍梧县| 淮阳县| 荃湾区| 盐源县| 铜鼓县| 中卫市| 彭泽县| 库尔勒市| 磐石市| 那曲县| 永春县| 石楼县| 郓城县| 平塘县| 正宁县| 绩溪县|