mysql中索引,聯(lián)合索引及最左匹配

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容