摘自:https://www.cnblogs.com/mengbin0546/p/10308755.html
約束 全稱完整性約束,它是關系數據庫中的對象,用來存放插入到一個表中一列數據的規則,用來確保數據的准確性和一致性。
索引 數據庫中用的最頻繁的操作是數據查詢,索引就是為了加速表中數據行的檢索而創建的一種分散的數據結構。可以把索引類比成書的目錄,有目錄的肯定比沒有目錄的書,更方便查找。
唯一約束 保證在一個字段或者一組字段里的數據都與表中其它行的對應數據不同。和主鍵約束不同,唯一約束允許為 NULL,只是只能有一行。
唯一索引 不允許具有索引值相同的行,從而禁止重復的索引或鍵值。
唯一約束和唯一索引 都是為了保證表中被限制的字段不允許有重復的值,看起來功能是一樣的,那為什么要設計這樣兩種一樣的功能呢?
首先創建兩個字段值一樣的表 t1,t2,並為 t1 表中的 col1 列設置唯一約束。
CREATE TABLE t1 (
col1 INT(11),
col2 VARCHAR(20),
CONSTRAINT t1_uq UNIQUE (col1)
);
CREATE TABLE t2 (
col1 INT(11),
col2 VARCHAR(20)
);
然后為表 t2 表中的 col1 列設置唯一索引
CREATE UNIQUE INDEX
t2_idx ON t2 (col1);
創建表 t3,並將 t1 表中的 col1 列設置為 t3 表中 col2 列的外鍵
CREATE TABLE t3 (
col1 INT(11),
col2 INT(11),
col3 VARCHAR(20),
CONSTRAINT t3_fk FOREIGN KEY (col2) REFERENCES t1 (col1)
);
到此為止,基本上就能得出,唯一約束和唯一索引在 MySQL 數據庫里區別了
- 概念上不同,約束是為了保證數據的完整性,索引是為了輔助查詢;
- 創建唯一約束時,會自動的創建唯一索引;
- 在理論上,不一樣,在實際使用時,基本沒有區別。
關於第二條,MySQL 中唯一約束是通過唯一索引實現的,為了保證沒有重復值,在插入新記錄時會再檢索一遍,怎樣檢索快,當然是建索引了,所以,在創建唯一約束的時候就創建了唯一索引。
4.唯一性索引
如果確定某個數據列只包含彼此各不相同的值,在為這個數據列創建索引的時候,就應該用關鍵字UNIQUE把它定義為一個唯一索引,Mysql會在有新紀錄插入數據表時,自動檢查新紀錄的這個字段的值是否已經在某個記錄的這個字段里出現過了。如果是,mysql將拒絕插入那條新紀錄。也就是說,唯一索引可以保證數據記錄的唯一性。事實上,在許多場合,人們創建唯一索引的目的往往不是為了提高訪問速度,而只是為了避免數據出現重復
5.索引的優點
5.1.可以通過建立唯一索引或者主鍵索引,保證數據庫表中每一行數據的唯一性
5.2.建立索引可以大大提高檢索的數據,以及減少表的檢索行數
5.3.在表連接的連接條件,可以加速表與表直接的相連
5.4.在分組和排序字句進行數據檢索,可以減少查詢時間中分組和排序時所消耗的時間(數據庫的記錄會重新排序)
5.5.建立索引,在查詢中使用索引,可以提高性能。
CREATE TABLE parent(
id INT NOT NULL,
PRIMARY KEY (id)
) TYPE=INNODB;
CREATE TABLE child(
id INT, parent_id INT,
INDEX par_ind (parent_id),
FOREIGN KEY (parent_id) REFERENCES parent(id)
ON DELETE CASCADE
) TYPE=INNODB;
如下是一個更復雜的例子,其中一個product_order表對其它兩個表有外鍵。一個外鍵引用一個product表中的雙列索引。另一個引用在customer表中的單行索引:
1 CREATE TABLE product ( 2 3 category INT NOT NULL, 4 5 id INT NOT NULL, 6 7 price DECIMAL, 8 9 PRIMARY KEY(category, id) 10 11 ) TYPE=INNODB; 12 13 CREATE TABLE customer (id INT NOT NULL, 14 15 PRIMARY KEY (id) 16 17 ) TYPE=INNODB; 18
19 CREATE TABLE product_order (no INT NOT NULL AUTO_INCREMENT, 20 21 product_category INT NOT NULL, 22 23 product_id INT NOT NULL, 24 25 customer_id INT NOT NULL, 26 27 PRIMARY KEY(no), 28 29 INDEX (product_category, product_id), 30 31 FOREIGN KEY (product_category, product_id) 32 33 REFERENCES product(category, id) 34 35 ON UPDATE CASCADE ON DELETE RESTRICT, 36 37 INDEX (customer_id), 38 39 FOREIGN KEY (customer_id) 40 41 REFERENCES customer(id) 42 43 ) TYPE=INNODB;
