mysql唯一性約束和索引


什么時候需要給字段添加索引:
-表中該字段中的數據量龐大
-經常被檢索,經常出現在where子句中的字段
-經常被DML操作的字段不建議添加索引---InnoDB的secondary index使用b+tree來存儲,因此在UPDATE、DELETE、INSERT的時候需要對b+tree進行調整,過多的索引會減慢更新的速度

 不在低基數列上建立索引,例如“性別”;不在索引列進行數學運算和函數運算;不要索引常用的小型表

索引等同於一本書的目錄
主鍵會自動添加索引,所以盡量根據主鍵查詢效率較高。
如經常根據sal進行查詢,並且遇到了性能瓶頸,首先查看程序是否存算法問題,再考慮對sal建立索引

P即primary,主鍵的意思---F即foreign key,外鍵的意思----M即mandatory,強制不可為空的意思


 

/*結論唯一索引與唯一約束一樣沒什么鳥不同(還沒遇到)  刪約束就是刪索引,刪索引就是刪約束*/
/*在添加索引或者唯一索引的組合索引時 key---MUL */
alter table Stu add index in_name(name);
alter table Stu add unique(id,name);
/*在添加唯一索引或者唯一約束時 key---uni */
alter table Stu add unique index(name);
alter table Stu add unique(name);

應該說是 key 屬性 --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是唯一的即可


 

查看索引  show index from 數據庫表名
PRIMARY KEY(主鍵索引)---alter table Student add primary key()
UNIQUE(唯一索引) ---alter table Stu add unique(dept)
INDEX(普通索引)---alter table Stu add index in_name(name)
FULLTEXT(全文索引)---alter table Stu add fulltext(txt_temp)
普通索引。組合索引-------alter table Stu add index in_name_age(name,age)    它沒有任何限制。
唯一索引。組合索引-------alter table Stu add unique(name,age)  自動給你設置唯一索引名字 ///或者自己些 alter table Stu add constraint uni_name_age unique(name,age)--索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一。


 

MySQL 中唯一約束是通過唯一索引實現的,為了保證沒有重復值,在插入新記錄時會再檢索一遍,怎樣檢索快,當然是建索引了,所以,在創建唯一約束的時候就創建了唯一索引。


 

1、唯一約束和唯一索引,都可以實現列數據的唯一,列值可以有null。
2、創建唯一約束,會自動創建一個同名的唯一索引,該索引不能單獨刪除,刪除約束會自動刪除索引。唯一約束是通過唯一索引來實現數據的唯一。
3、創建一個唯一索引,這個索引就是獨立,可以單獨刪除。
4、如果一個列上想有約束和索引,且兩者可以單獨的刪除。可以先建唯一索引,再建同名的唯一約束。
5、如果表的一個字段,要作為另外一個表的外鍵,這個字段必須有唯一約束(或是主鍵),如果只是有唯一索引,就會報錯。



  約束是業務檢查,比方說非空約束,check約束,那是檢查字段非空,是否符合check。而索引是一種數據結構, rowid與字段值的鍵值對.  兩個東西的效果是一樣。但:在建立唯一約束時,會自動創建一個唯一索引.並且,失效該約束時,索引自動刪除.而創建唯一索引則不會自動創建唯一約束.因此在建表時,如果要創建唯一索引,最好先建唯一索引再創建唯一約束.這樣的話,在進行大批量數據插入時,可以先失效約束,插入完成后再進行索引重建.
  除了引文中提到的,要被外鍵引用必須有唯一約束,還有這個區別:索引的鍵不一定要和唯一約束完全匹配,唯一約束可以只用索引的前導列。


 


多列索引
1.普通索引。
這是最基本的索引,它沒有任何限制。它有以下幾種創建方式:
(1)創建索引:CREATE INDEX indexName ON tableName(tableColumns(length));如果是CHAR,VARCHAR類型,length可以小於字段實際長度;如果是BLOB 和 TEXT 類型,必須指定length,下同。
(2)修改表結構:ALTER tableName ADD INDEX [indexName] ON (tableColumns(length)) 
(3)創建表的時候直接指定:CREATE TABLE tableName ( [...], INDEX [indexName] (tableColumns(length)) ;
2.唯一索引。
它與前面的"普通索引"類似,不同的就是:索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一。它有以下幾種創建方式:
(1)創建索引:CREATE UNIQUE INDEX indexName ON tableName(tableColumns(length))
(2)修改表結構:ALTER tableName ADD UNIQUE [indexName] ON (tableColumns(length))
(3)創建表的時候直接指定:CREATE TABLE tableName ( [...], UNIQUE [indexName] (tableColumns(lengt

 


 

 

索引的優點

索引可以讓服務器快速定位到表的指定位置。B-Tree索引,按照順序存儲數據,可以用於order by 和Group by 操作。因為數據是
有序的,所有B-tree也就會獎相關的列值存儲在一起。優點如下:

    1. 索引大大減少了服務器掃描的數據量
    2. 索引可以幫助服務器避免排序和臨時表
    3. 將隨機IO變為順序IO

存儲引擎用於快速找到記錄的一種數據結構。

 


 

 

索引類型

索引有很多種類型,如:B-tree索引、哈希索引、空間數據索引R-TREE 、全文索引、主鍵索引等,在Mysql
中,索引是在存儲引擎層而不是服務器層實現的。所以沒有統一的索引標准——不同存儲引擎的索引工作方式並
不一樣,也不是所有存儲引擎都支持所有類型的索引。即使多個存儲引擎支持同一種類型的索引,其底層實現
也可能不一樣。

B-Tree索引

討論索引的時候,如果沒有特別的指明類型,那么多半說的是B-Tree索引,它使用B-Tree數據結構來存儲數據。
實際很多存儲引擎使用的是B+Tree,即每一個葉子節點都包含指向下一個葉子節點的指針,從而方便葉子節點
的范圍遍歷。

存儲引擎不同的方式使用B-Tree索引,性能也各有不同,各有優劣。如:MyISAM使用前綴壓縮技術使得索引更小,
但是InnoDB則按照原數據格式進行存儲。 MyISAM索引通過數據的物理位置引用被索引的行,而InnoDB則根據主鍵
引用被索引的行

  • B-Tree索引查詢類型

B-Tree適用於全鍵值、鍵值范圍,或者鍵前綴查找。

哈希索引

Hash Index 基於哈希表實現,只有精確匹配索引所有列的查詢才有效。對於每一行數據,存儲引擎都會對所有的索引列計算
一個哈希碼,哈希碼是一個較小的值,並且不同鍵值的行計算出來的哈希碼也不一樣。哈希索引將所有的哈希碼存儲在索引中,
同時在哈希表中保存指向每個數據行的指針。

InnoDB引擎有一個特殊功能叫“自適應哈希索引,當InnoDB某些索引值被使用得非常頻繁時,也在內存中基於B-Tree索引之上
再創建一個哈希索引。這樣就讓Btree索引也具有哈希索引的一些優點。這是一個完全自動的,內部的行為,用戶無法控制或者
配置,不過如果有必要完全可以關閉該功能。

  • 創建自定義的Hash Index
SELECT id FROM url_tbl WHERE url="http://baidu.com"
SELECT id FROM url_tbl WHERE url_crc=CRC32("http://baidu.com")

如果采用這種方式,記住不要使用SHA1和MD5()作為哈希函數,因為這兩函數計算出非常長的字符串,會浪費大量的空間,比較時
也會更慢。兩函數設計目標是最大限度消除沖突,但這里並不需要這樣高的要求。如果數據表非常大,CRC32會出現大量的哈希沖突,
則可以考慮自己實現一個簡單的64痊哈希函數。

R-Tree

MyISAM引擎支持空間索引,可以用作地理數據存儲。

全文索引

全文索引是一種特殊類型的索引,它查找的是文本中的關鍵詞,而不是直接索引中的值。全文搜索和其他幾類索引的匹配方式完全不
一樣。它有很多需要注意的,如停用詞、詞干、復數、布爾搜索等。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM