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的表...