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