Mysql中key 、primary key 、unique key 與index區(qū)別
在平時(shí),我們添加索引通常使用
alter table xx add index xx(xx);
在mysql中聲明key通常會(huì)創(chuàng)建索引
key 是數(shù)據(jù)庫(kù)的物理結(jié)構(gòu),它包含兩層意義和作用:
一是約束(偏重于約束和規(guī)范數(shù)據(jù)庫(kù)的結(jié)構(gòu)完整性),
二是索引(輔助查詢用的)。
包括primary key, unique key, foreign key 等。
primary key 有兩個(gè)作用,一是約束作用(constraint),用來規(guī)范一個(gè)存儲(chǔ)主鍵和唯一性,但同時(shí)也在此key上建立了一個(gè)主鍵索引;
PRIMARY KEY 約束:唯一標(biāo)識(shí)數(shù)據(jù)庫(kù)表中的每條記錄;
主鍵必須包含唯一的值;
主鍵列不能包含 NULL 值;
每個(gè)表都應(yīng)該有一個(gè)主鍵,并且每個(gè)表只能有一個(gè)主鍵。(PRIMARY KEY 擁有自動(dòng)定義的 UNIQUE 約束)
unique key 也有兩個(gè)作用,一是約束作用(constraint),規(guī)范數(shù)據(jù)的唯一性,但同時(shí)也在這個(gè)key上建立了一個(gè)唯一索引;
UNIQUE 約束:唯一標(biāo)識(shí)數(shù)據(jù)庫(kù)表中的每條記錄。
UNIQUE 和 PRIMARY KEY 約束均為列或列集合提供了唯一性的保證。(每個(gè)表可以有多個(gè) UNIQUE 約束,但是每個(gè)表只能有一個(gè) PRIMARY KEY 約束)
foreign key 也有兩個(gè)作用,一是約束作用(constraint),規(guī)范數(shù)據(jù)的引用完整性,但同時(shí)也在這個(gè)key上建立了一個(gè)index;
可見,mysql的key是同時(shí)具有constraint和index的意義,這點(diǎn)和其他數(shù)據(jù)庫(kù)表現(xiàn)的可能有區(qū)別。(至少在Oracle上建立外鍵,不會(huì)自動(dòng)建立index),因此創(chuàng)建key也有如下幾種方式:
(1)在字段級(jí)以key方式建立, 如 create table t (id int not null primary key);
(2)在表級(jí)以constraint方式建立,如create table t(id int, CONSTRAINT pk_t_id PRIMARY key (id));
(3)在表級(jí)以key方式建立,如create table t(id int, primary key (id));
其它key創(chuàng)建類似,但不管那種方式,既建立了constraint,又建立了index,只不過index使用的就是這個(gè)constraint或key。
2: index是數(shù)據(jù)庫(kù)的物理結(jié)構(gòu),它只是輔助查詢的,它創(chuàng)建時(shí)會(huì)在另外的表空間(mysql中的innodb表空間)以一個(gè)類似目錄的結(jié)構(gòu)存儲(chǔ)。索引要分類的話,分為前綴索引、全文本索引等;
因此,索引只是索引,它不會(huì)去約束索引的字段的行為(那是key要做的事情)。如,create table t(id int,index inx_tx_id (id));
3 總結(jié),最后的釋疑:
(1)我們說索引分類,分為
- 主鍵索引(必須指定為“PRIMARY KEY”,沒有PRIMARY Index)、
- 唯一索引(unique index,一般寫成unique key)、
- 普通索引(index,只有這一種才是純粹的index)等,也是基于是不是把index看作了key。 比如 create table t(id int, unique indexinx_tx_id (id));--index當(dāng)作了key使用
(2)最重要的也就是,不管如何描述,需要理解index是純粹的index(普通的key,或者普通索引index),還是被當(dāng)作key(如:unique index、unique key和primary key),若當(dāng)作key時(shí)則會(huì)有兩種意義或起兩種作用。
聯(lián)合索引
命名規(guī)則:表名_字段名
1、需要加索引的字段,要在where條件中
2、數(shù)據(jù)量少的字段不需要加索引
3、如果where條件中是OR關(guān)系,加索引不起作用
4、符合最左原則
https://segmentfault.com/q/1010000003984016/a-1020000003984281
聯(lián)合索引又叫復(fù)合索引。對(duì)于復(fù)合索引:Mysql從左到右的使用索引中的字段,一個(gè)查詢可以只使用索引中的一部份,但只能是最左側(cè)部分。例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3種組合進(jìn)行查找,但不支持 b,c進(jìn)行查找 .當(dāng)最左側(cè)字段是常量引用時(shí),索引就十分有效。
mysql聯(lián)合索引
https://www.cnblogs.com/lanqi/p/10282279.html