mysql數(shù)據(jù)自增ID為2的解決方案
mysql數(shù)據(jù)自增ID為2問題
查看配置
show variables like '%increment%';
如果:
auto_increment_increment=2
執(zhí)行:
set @@global.auto_increment_increment = 1;? set @@auto_increment_increment =1;
如果:
auto_increment_offset=2
執(zhí)行:
set @@global.auto_increment_offset =1; set @@auto_increment_offset =1;
mysql自增id理解
1. 什么是自增id
自增ID是在設(shè)計(jì)表時(shí)如果將id字段的值設(shè)置為自增的形式也就是AUTO_INCREMENT,那么當(dāng)插入一行數(shù)據(jù)時(shí)就無需指定id,數(shù)據(jù)表會根據(jù)前一個id值+1進(jìn)行填充。
指定了AUTO_INCREMENT的列必須要建索引,一般把ID作為主鍵,這樣系統(tǒng)會自動為ID建立索引。
2. 自增id的好處
(1)增加記錄時(shí),可以不用指定id字段,不用擔(dān)心主鍵重復(fù)問題。
(2)數(shù)據(jù)庫自動編號,速度快,而且是增量增長,按順序存放,對于檢索非常有利;
(3)數(shù)字型,占用索引空間小,范圍查找與排序友好,在程序中傳遞也方便;
(4)避免像UUID這樣隨機(jī)字符串帶來的頁分裂問題等
頁分裂問題:
一頁總要被存滿,然后新開一頁繼續(xù),這種行為被稱作頁分裂。何時(shí)開辟新的頁,mysql規(guī)定了一個分裂因子,達(dá)到頁存儲空間的15/16則存到下一頁。頁分裂的存在可能極大影響性能維護(hù)索引的性能。通常提倡的是,設(shè)定一個無意義的整數(shù)自增索引,有利于索引存儲
如果非自增或不是整數(shù)索引,如非自增整數(shù)、類似MD5的字符串,以他們作為索引值時(shí),因?yàn)榇迦氲南乱粭l數(shù)據(jù)的值不一定比上一條大,甚至比當(dāng)前頁所有值都小,需要跑到前幾頁去比較而找到合適位置,InnoDB無法簡單的把新行插入到上一行后面,而找到并插入索引后,可能導(dǎo)致該頁達(dá)到分裂因子閥值,需要頁分裂,進(jìn)一步導(dǎo)致后面所有的索引頁的分裂和排序,數(shù)據(jù)量小也許沒什么問題,數(shù)據(jù)量大的話可能會浪費(fèi)大量時(shí)間,產(chǎn)生許多碎片。
3. 自增id的壞處
(1) 不具有連續(xù)性,表中auto_increment最大值被刪除,將不會被重用。就是說會跳號(如果設(shè)定的auto_increment_increment是1,那么下一次插入的id值將會從被刪除的最大值算起,也就是被刪除的最大值+1)
(2)歷史數(shù)據(jù)表的主鍵id會與數(shù)據(jù)表的id重復(fù),兩張自增id做主鍵的表合并時(shí),id會有沖突,但如果各自的id還關(guān)聯(lián)了其他表,這就很不好操作。
(3) 很難處理分布式存儲的數(shù)據(jù)表,尤其是需要合并表的情況下
(4) 在系統(tǒng)集成或割接時(shí),如果新舊系統(tǒng)主鍵不同是數(shù)字型就會導(dǎo)致修改主鍵數(shù)據(jù)類型,這也會導(dǎo)致其它有外鍵關(guān)聯(lián)的表的修改,后果同樣很嚴(yán)重;
4. 當(dāng)自增id用完了怎么辦?
自增id的數(shù)據(jù)上限和受主鍵類型的影響,當(dāng)自增id超過最大值,就會提示主鍵沖突,所以建議根據(jù)業(yè)務(wù)需求設(shè)置主鍵數(shù)據(jù)類型,如果超過int 數(shù)值范圍,可以考慮bigint類型(2^64-1)。
當(dāng)隱性的row_id用完,數(shù)據(jù)庫不會產(chǎn)生錯誤,它會重新從0開始覆蓋之前的數(shù)據(jù),這樣會導(dǎo)致數(shù)據(jù)丟失。
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Mysql的timestamp時(shí)間戳詳解及2038問題
本文主要介紹了Mysql的timestamp時(shí)間戳詳解及2038問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04MySQL使用Partition功能實(shí)現(xiàn)水平分區(qū)的策略
這篇文章主要介紹了MySQL使用Partition功能實(shí)現(xiàn)水平分區(qū),給大家提到了水平分區(qū)的5種策略,通過sql語句給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-12-12Mysql如何導(dǎo)出篩選數(shù)據(jù)并導(dǎo)出帶表頭的csv文件
這篇文章主要介紹了Mysql如何導(dǎo)出篩選數(shù)據(jù)并導(dǎo)出帶表頭的csv文件,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07mysql表操作-約束刪除、用戶填加、授權(quán)和撤權(quán)方式
本文詳細(xì)介紹了數(shù)據(jù)庫的約束刪除、密碼策略設(shè)置、用戶管理以及權(quán)限控制的具體操作步驟,包括查看與修改表的約束條件、設(shè)置數(shù)據(jù)庫密碼的策略、增加用戶以及用戶權(quán)限的授權(quán)與撤銷等,這些操作對于數(shù)據(jù)庫管理員來說是基本且必須掌握的技能2024-09-09MySQL 5.6 中的 TIMESTAMP 和 explicit_defaults_for_timestamp 參數(shù)
這篇文章主要介紹了MySQL 5.6 中的 TIMESTAMP 和 explicit_defaults_for_timestamp 參數(shù),需要的朋友可以參考下2015-08-08mysql.help_topic生成序列的方法實(shí)現(xiàn)
本文探討了如何使用MySQL的help_topic表生成序列,并介紹了相應(yīng)的SQL查詢語句和實(shí)現(xiàn)方法,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10