主鍵,不少人以為自己懂了,卻不透徹

2021-09-29 08:37:38 字數 2762 閱讀 3321

mysql是被廣泛應用的資料庫,innodb又是用得最廣的儲存引擎,主鍵又是對innodb效能影響最大的因素之一,主鍵選擇對,可以極大提公升效能。

innodb選擇什麼列作為主鍵,有一些最佳實踐:

(1)不能為空的列;

(2)不能重複的列;

(3)很少改變的列;

畫外音:行是按照聚集索引物理排序的,如果主鍵頻繁改變,物理順序會改變,效能會急劇降低。

(4)經常被檢索(where key=***)的列

畫外音:被檢索的列上要建立索引,如果該索引是聚集索引,能夠避免回表,效能提公升幾乎一倍。

(5)不是太長的列

畫外音:普通索引葉子節點會儲存主鍵值,如果主鍵值太長,會增加普通索引的大小。

聚集索引,普通索引底層結構如何

使用者id:uid

訊息id:msgid

訂單id:oid

這些列,能夠很好的滿足非空、唯

一、不變、經常被查詢、長整型等最佳實踐,效能較高。

畫外音:這些id建議業務側使用snowflake生成,即全域性唯一,又趨勢遞增。

如果沒有這樣的業務屬性,也可以使用自增id(auto_inc_id)作為主鍵,自增id能夠滿足非空,唯一,不變,長整型等最佳實踐,效能也比較高。

畫外音:自增id不宜暴露給上游,否則分庫擴充套件時有大坑。

但是,上面畢竟是理論,落到實操層面,我們真的掌握得這麼透徹嗎?下面五個小習題,看大家對innodb主鍵到底掌握到什麼程度。

練習一:建表時,可不可以不宣告主鍵?

(1) create table user(

name varchar(10)

)engine=innodb;

(2) insert into user values(『shenjian』);

(3) insert into user values(『shenjian』);

畫外音:建表時,不宣告主鍵,插入兩個相同的元素。

提問,連續執行上面的語句,執行結果是:

a 建表語句(1)報錯

b 插入語句(2)報錯

c 插入語句(3)報錯

d 均不報錯

練習二:建表時,可不可以不宣告主鍵非空?

(1) create table user(

id int,

name varchar(10),

primary key(id)

)engine=innodb;

(2) insert into user(name) values(『shenjian』);

(3) insert into user(name) values(『shenjian』);

畫外音:建表時,不宣告非空,插入兩個相同的元素。

提問,連續執行上面的語句,執行結果是:

a 建表語句(1)報錯

b 插入語句(2)報錯

c 插入語句(3)報錯

d 均不報錯

練習三:建表時,可不可以選擇多個字段做主鍵?

(1) create table user(

id int not null,

name varchar(10) not null,

primary key(id, name)

)engine=innodb;

(2) insert into user values(1, 『shenjian』);

(3) insert into user values(1, 『zhangsan』);

(4) insert into user values(2, 『shenjian』);

畫外音:建表時,宣告聯合主鍵(a,b),插入若干元素,有些a重複,有些b重複。

提問,連續執行上面的語句,執行結果是:

a 建表語句(1)報錯

b 插入語句(2)報錯

c 插入語句(3)報錯

d 插入語句(3)報錯

e 均不報錯

練習四:可不可以主動插入自增主鍵?

(1) create table user(

id int auto_increment,

name varchar(10) not null,

primary key(id)

)engine=innodb;

(2) insert into user(name) values(『shenjian』);

(3) insert into user(id, name) values(10,『shenjian』);

(4) insert into user(name) values(『shenjian』);

畫外音:建表時,自增id為主鍵,插入若干元素,有些包含自增id,有些不包含。

提問,連續執行上面的語句,執行結果是:

a 建表語句(1)報錯

b 插入語句(2)報錯

c 插入語句(3)報錯

d 插入語句(3)報錯

e 均不報錯

練習五:建表時,可不可以使用聯合自增主鍵?

(1) create table user(

id int auto_increment,

name varchar(10) not null,

primary key(name, id)

)engine=innodb;

(2) insert into user(name) values(『shenjian』);

(3) insert into user(id, name) values(10,『shenjian』);

(4) insert into user(name) values(『shenjian』);

不少人為什麼將Python作為黑客攻擊語言?

python 是乙個高層次的結合了解釋性 編譯性 互動性和物件導向的指令碼語言。重點是,python 是一種對初學者非常友好的語言,從應用程式開發到文書處理 web甚至是遊戲能提供支援,不少人也會將python作為黑客攻擊語言。為何python會被選用為黑客語言呢?例如不外乎這四點 支援功能強大的黑...

中國歷史上5個謠言,單是第1條就騙了不少人!

謠言1 嘉慶要殺和珅,和珅拿出乾隆留下的保命密信,開啟一看卻傻了眼,上邊寫著三個字 留全屍 真相 這個橋段其實是 和電視劇集裡杜撰的,只是為了增加劇情的需要,但卻被當成了歷史上的真事。身為清朝第一巨貪的和珅,早在嘉慶繼位之初就想殺他,但礙於太上皇乾隆的庇佑,所以嘉慶一直在隱忍。但乾隆剛一駕崩,嘉慶馬...

以時間換空間,聯合主鍵 舉例

在建立資料庫是,以空間換時間應該怎麼理解呢,舉例 建設你要建立乙個商品的資料庫,肯定要有乙個商品表goods,這個商品有喝多宣傳,那肯定還要有乙個表goods image表,而且乙個 商品可以對應很多,所以是一對多的關係 但是這個商品有乙個主宣傳,那麼如果將主 宣傳也新增到goods image的表...