mysql索引与约束有什么关系_MySQL 约束与索引
約束
MYSQL不支持非主鍵的聚集索引。
PRIMARY KEY 不可空不可重復(fù),在一個(gè)表里可以定義聯(lián)合主鍵;
primary key = unique + not null
PRIMARY KEY是一個(gè)唯一KEY,此時(shí),所有的關(guān)鍵字列必須定義為NOT NULL。如果這些列沒(méi)有被明確地定義為NOT NULL,MySQL應(yīng)隱含地定義這些列。一個(gè)表只有一個(gè)PRIMARY KEY。如果您沒(méi)有PRIMARY KEY并且一個(gè)應(yīng)用程序要求在表中使用PRIMARY KEY,則MySQL返回第一個(gè)UNIQUE索引,此索引沒(méi)有作為PRIMARY KEY的NULL列。
KEY通常是INDEX同義詞。如果關(guān)鍵字屬性PRIMARY KEY在列定義中已給定,則PRIMARY KEY也可以只指定為KEY。這么做的目的是與其它數(shù)據(jù)庫(kù)系統(tǒng)兼容
desc tablename;
看到Key那一欄,可能會(huì)有4種值,即’啥也沒(méi)有’,’PRI’,’UNI’,’MUL’
1. 如果Key是空的, 那么該列值的可以重復(fù), 表示該列沒(méi)有索引, 或者是一個(gè)非唯一的復(fù)合索引的非前導(dǎo)列
2. 如果Key是PRI, 那么該列是主鍵的組成部分
3. 如果Key是UNI, 那么該列是一個(gè)唯一值索引的第一列(前導(dǎo)列),并別不能含有空值(NULL)
4. 如果Key是MUL, 那么該列的值可以重復(fù), 該列是一個(gè)非唯一索引的前導(dǎo)列(第一列)或者是一個(gè)唯一性索引的組成部分但是可以含有空值NULL
如果對(duì)于一個(gè)列的定義,同時(shí)滿足上述4種情況的多種,比如一個(gè)列既是PRI,又是UNI
那么”desc 表名”的時(shí)候,顯示的Key值按照優(yōu)先級(jí)來(lái)顯示 PRI->UNI->MUL 那么此時(shí),顯示PRI
一個(gè)唯一性索引列可以顯示為PRI,并且該列不能含有空值,同時(shí)該表沒(méi)有主鍵
一個(gè)唯一性索引列可以顯示為MUL, 如果多列構(gòu)成了一個(gè)唯一性復(fù)合索引
因?yàn)殡m然索引的多列組合是唯一的,比如ID+NAME是唯一的,但是沒(méi)一個(gè)單獨(dú)的列依然可以有重復(fù)的值
只要ID+NAME是唯一的即可
因此什么是聚集索引、什么是非聚集索引?
聚集索引和非聚集索引的根本區(qū)別是表記錄的排列順序和與索引的排列順序是否一致,聚集索引表記錄的排列順序與索引的排列順序一致,優(yōu)點(diǎn)是查詢速度快,因?yàn)橐坏┚哂械谝粋€(gè)索引值的紀(jì)錄被找到,具有連續(xù)索引值的記錄也一定物理的緊跟其后。
聚集索引的缺點(diǎn)是對(duì)表進(jìn)行修改速度較慢,這是為了保持表中的記錄的物理順序與索引的順序一致,而把記錄插入到數(shù)據(jù)頁(yè)的相應(yīng)位置,必須在數(shù)據(jù)頁(yè)中進(jìn)行數(shù)據(jù)重排,降低了執(zhí)行速度。建議使用聚集索引的場(chǎng)合為:
a.此列包含有限數(shù)目的不同值;
b.查詢的結(jié)果返回一個(gè)區(qū)間的值;
c.查詢的結(jié)果返回某值相同的大量結(jié)果集。
非聚集索引指定了表中記錄的邏輯順序,但記錄的物理順序和索引的順序不一致,聚集索引和非聚集索引都采用了B+樹(shù)的結(jié)構(gòu),但非聚集索引的葉子層并不與實(shí)際的數(shù)據(jù)頁(yè)相重疊,而采用葉子層包含一個(gè)指向表中的記錄在數(shù)據(jù)頁(yè)中的指針的方式。非聚集索引比聚集索引層次多,添加記錄不會(huì)引起數(shù)據(jù)順序的重組。建議使用非聚集索引的場(chǎng)合為:
a.此列包含了大量數(shù)目不同的值;
b.查詢的結(jié)束返回的是少量的結(jié)果集;
c.order by 子句中使用了該列。
--不用索引查詢
Select * FROM IndexTestTable WHIT(INDEX(0))
Where Status='B'
--創(chuàng)建聚集索引
Create CLUSTERED INDEX icIndexTestTable
ON IndexTestTable(Status)
--使用索引查詢
Select * FROM IndexTestTable WITH(INDEX(icIndexTestTable))
Where Status='B'
聚集索引確定表中數(shù)據(jù)的物理順序。聚集索引類(lèi)似于電話簿,按姓氏排列數(shù)據(jù)。由于聚集索引規(guī)定數(shù)據(jù)在表中的物理存儲(chǔ)順序,因此一個(gè)表只能包含一個(gè)聚集索引。但該索引可以包含多個(gè)列(組合索引),就像電話簿按姓氏和名字進(jìn)行組織一樣
非聚集索引與課本中的索引類(lèi)似。數(shù)據(jù)存儲(chǔ)在一個(gè)地方,索引存儲(chǔ)在另一個(gè)地方,索引帶有指針指向數(shù)據(jù)的存儲(chǔ)位置。索引中的項(xiàng)目按索引鍵值的順序存儲(chǔ),而表中的信息按另一種順序存儲(chǔ)(這可以由聚集索引規(guī)定)。
總結(jié)
以上是生活随笔為你收集整理的mysql索引与约束有什么关系_MySQL 约束与索引的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java批量删除接口怎么定义_教你在Ja
- 下一篇: mysql php加速_mysql存储过