mysql數(shù)據(jù)自增ID為2的解決方案
mysql數(shù)據(jù)自增ID為2問(wèn)題
查看配置
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í)就無(wú)需指定id,數(shù)據(jù)表會(huì)根據(jù)前一個(gè)id值+1進(jìn)行填充。
指定了AUTO_INCREMENT的列必須要建索引,一般把ID作為主鍵,這樣系統(tǒng)會(huì)自動(dòng)為ID建立索引。
2. 自增id的好處
(1)增加記錄時(shí),可以不用指定id字段,不用擔(dān)心主鍵重復(fù)問(wèn)題。
(2)數(shù)據(jù)庫(kù)自動(dòng)編號(hào),速度快,而且是增量增長(zhǎng),按順序存放,對(duì)于檢索非常有利;
(3)數(shù)字型,占用索引空間小,范圍查找與排序友好,在程序中傳遞也方便;
(4)避免像UUID這樣隨機(jī)字符串帶來(lái)的頁(yè)分裂問(wèn)題等
頁(yè)分裂問(wèn)題:
一頁(yè)總要被存滿(mǎn),然后新開(kāi)一頁(yè)繼續(xù),這種行為被稱(chēng)作頁(yè)分裂。何時(shí)開(kāi)辟新的頁(yè),mysql規(guī)定了一個(gè)分裂因子,達(dá)到頁(yè)存儲(chǔ)空間的15/16則存到下一頁(yè)。頁(yè)分裂的存在可能極大影響性能維護(hù)索引的性能。通常提倡的是,設(shè)定一個(gè)無(wú)意義的整數(shù)自增索引,有利于索引存儲(chǔ)
如果非自增或不是整數(shù)索引,如非自增整數(shù)、類(lèi)似MD5的字符串,以他們作為索引值時(shí),因?yàn)榇迦氲南乱粭l數(shù)據(jù)的值不一定比上一條大,甚至比當(dāng)前頁(yè)所有值都小,需要跑到前幾頁(yè)去比較而找到合適位置,InnoDB無(wú)法簡(jiǎn)單的把新行插入到上一行后面,而找到并插入索引后,可能導(dǎo)致該頁(yè)達(dá)到分裂因子閥值,需要頁(yè)分裂,進(jìn)一步導(dǎo)致后面所有的索引頁(yè)的分裂和排序,數(shù)據(jù)量小也許沒(méi)什么問(wèn)題,數(shù)據(jù)量大的話(huà)可能會(huì)浪費(fèi)大量時(shí)間,產(chǎn)生許多碎片。
3. 自增id的壞處
(1) 不具有連續(xù)性,表中auto_increment最大值被刪除,將不會(huì)被重用。就是說(shuō)會(huì)跳號(hào)(如果設(shè)定的auto_increment_increment是1,那么下一次插入的id值將會(huì)從被刪除的最大值算起,也就是被刪除的最大值+1)
(2)歷史數(shù)據(jù)表的主鍵id會(huì)與數(shù)據(jù)表的id重復(fù),兩張自增id做主鍵的表合并時(shí),id會(huì)有沖突,但如果各自的id還關(guān)聯(lián)了其他表,這就很不好操作。
(3) 很難處理分布式存儲(chǔ)的數(shù)據(jù)表,尤其是需要合并表的情況下
(4) 在系統(tǒng)集成或割接時(shí),如果新舊系統(tǒng)主鍵不同是數(shù)字型就會(huì)導(dǎo)致修改主鍵數(shù)據(jù)類(lèi)型,這也會(huì)導(dǎo)致其它有外鍵關(guān)聯(lián)的表的修改,后果同樣很?chē)?yán)重;
4. 當(dāng)自增id用完了怎么辦?
自增id的數(shù)據(jù)上限和受主鍵類(lèi)型的影響,當(dāng)自增id超過(guò)最大值,就會(huì)提示主鍵沖突,所以建議根據(jù)業(yè)務(wù)需求設(shè)置主鍵數(shù)據(jù)類(lèi)型,如果超過(guò)int 數(shù)值范圍,可以考慮bigint類(lèi)型(2^64-1)。
當(dāng)隱性的row_id用完,數(shù)據(jù)庫(kù)不會(huì)產(chǎn)生錯(cuò)誤,它會(huì)重新從0開(kāi)始覆蓋之前的數(shù)據(jù),這樣會(huì)導(dǎo)致數(shù)據(jù)丟失。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Ubuntu上安裝MySQL+問(wèn)題處理+安全優(yōu)化
這篇文章主要匯總介紹了Ubuntu上安裝MySQL+問(wèn)題處理+安全優(yōu)化的相關(guān)事項(xiàng),非常的細(xì)致全面,有需要的小伙伴可以參考下2016-03-03
SQL使用WHERE條件語(yǔ)句的項(xiàng)目實(shí)踐
本文將介紹WHERE子句中使用的通用語(yǔ)法,它還將概述如何在單個(gè)WHERE子句中組合多個(gè)搜索條件謂詞以更細(xì)粒度的方式過(guò)濾數(shù)據(jù),以及如何使用NOT操作符排除而不是包含滿(mǎn)足給定搜索條件的行,感興趣的可以了解一下2023-09-09
磁盤(pán)已滿(mǎn)造成的mysql啟動(dòng)失敗問(wèn)題分享
這篇文章主要介紹了磁盤(pán)已滿(mǎn)造成的mysql啟動(dòng)失敗問(wèn)題分享,需要的朋友可以參考下2014-04-04
SQL匯總統(tǒng)計(jì)與GROUP BY過(guò)濾查詢(xún)實(shí)現(xiàn)
這篇文章主要介紹了SQL匯總統(tǒng)計(jì)與GROUP BY過(guò)濾查詢(xún)實(shí)現(xiàn),GROUP BY 實(shí)質(zhì)是先排序后分組,遵照索引建的最佳左前綴。當(dāng)無(wú)法使用索引時(shí),增大max_length_for_sort_data和sort_buffer參數(shù)的值2023-01-01
mysql實(shí)現(xiàn)查詢(xún)每門(mén)課程成績(jī)最好的前兩名學(xué)生id和姓名
這篇文章主要介紹了mysql實(shí)現(xiàn)查詢(xún)每門(mén)課程成績(jī)最好的前兩名學(xué)生id和姓名方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11

