- 索引是對(duì) 數(shù)據(jù)庫(kù)中一列或者多列的值進(jìn)行排序的一中結(jié)構(gòu),使用索引可以快速訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)中表的特定信息。索引的一個(gè)主要的目的就是加快檢索表中數(shù)據(jù),亦即能協(xié)助信息搜索者盡快的找到符合限制條件的記錄的輔助數(shù)據(jù)結(jié)構(gòu)。
- 簡(jiǎn)單來(lái)說(shuō)索引就是數(shù)據(jù)庫(kù)的目錄。
索引的最大作用就是加快數(shù)據(jù)庫(kù)的查詢(xún)速度。
數(shù)據(jù)庫(kù)在執(zhí)行一條SQL語(yǔ)句的時(shí)候,默認(rèn)的方式是根據(jù)搜索條件進(jìn)行全表掃描,遇到匹配條件的就加入搜索結(jié)果集合。但若是遇到大數(shù)據(jù)量的查詢(xún)時(shí),直接全表匹配的方式太慢了,這時(shí)候就需要用到索引。我們對(duì)某一字段增加索引,查詢(xún)的時(shí)候就會(huì)先去索引列表中一次定位到特定值得行數(shù),大大減少遍歷匹配的行數(shù),所以可以明顯的增加查詢(xún)的速度。
- 主鍵索引:數(shù)據(jù)記錄里面不能有null,數(shù)據(jù)內(nèi)容不能重復(fù),在一張表里面不能有多個(gè)主鍵索引。
- 普通索引:使用字段關(guān)鍵字建立的索引,主要是提高查詢(xún)速度。
- 唯一索引:字段數(shù)據(jù)是唯一的,數(shù)據(jù)內(nèi)容里面能否為null,在一張表里面,是可以添加多個(gè)唯一索引。
- 全文索引:在早起版本中只有myisam引擎支持全文索引,在innodb5.6后也支持全文索引,在MySQL中全文索引不支持中文。我們一般使用sphinx集合coreseek來(lái)實(shí)現(xiàn)中文的全文索引。
執(zhí)行Create Table語(yǔ)句時(shí)可以創(chuàng)建索引,也可以單獨(dú)用Create index或者 Alter Table來(lái)為表增加索引。
ALTER TABLE用來(lái)創(chuàng)建普通索引、unique索引或者primary key索引。
ALTER TABLE table_name ADD INDEX index_name(column_list) ALTER TABLE table_name ADD UNIQUE(column_list)ALTER TABLE table_name ADD PRIMARY KEY(column_list)
CREATE INDEX可以創(chuàng)建普通索引和UNIQUE索引。
CREATE INDEX index_name ON table_name (column_list)CREATE UNIQUE INDEX index_name ON table_name (column_list)
注: table_name 索引名不可選。
可利用ALTER TABLE或DROP INDEX語(yǔ)句來(lái)刪除索引。類(lèi)似于CREATE INDEX語(yǔ)句,DROP INDEX可以在ALTER TABLE內(nèi)部作為一條語(yǔ)句處理,語(yǔ)法如下。
DROP INDEX index_name ON talbe_nameALTER TABLE table_name DROP INDEX index_nameALTER TABLE table_name DROP PRIMARY KEY
show index from tblname;show keys from tblname;
字段名 | 解釋 |
---|---|
Table | 表的名稱(chēng) |
Non_unique | 如果索引不能包括重復(fù)詞,則為0。如果可以,則為1 |
Key_name | 索引的名稱(chēng) |
Seq_in_index | 索引中的列序列號(hào),從1開(kāi)始。 |
Column_name | 列名稱(chēng)。 |
Collation | 列以什么方式存儲(chǔ)在索引中。在MySQL中,有值‘A’(升序)或NULL(無(wú)分類(lèi))。 |
Cardinality | 索引中唯一值的數(shù)目的估計(jì)值。通過(guò)運(yùn)行ANALYZE TABLE或myisamchk -a可以更新?;鶖?shù)根據(jù)被存儲(chǔ)為整數(shù)的統(tǒng)計(jì)數(shù)據(jù)來(lái)計(jì)數(shù),所以即使對(duì)于小型表,該值也沒(méi)有必要是精確的?;鶖?shù)越大,當(dāng)進(jìn)行聯(lián)合時(shí),MySQL使用該索引的機(jī)會(huì)就越大。 |
Sub_part | 如果列只是被部分地編入索引,則為被編入索引的字符的數(shù)目。如果整列被編入索引,則為NULL。 |
Packed | 指示關(guān)鍵字如何被壓縮。如果沒(méi)有被壓縮,則為NULL。 |
Null | 如果列含有NULL,則含有YES。如果沒(méi)有,則該列含有NO。 |
Index_type | 用過(guò)的索引方法(BTREE, FULLTEXT, HASH, RTREE)。 |
Comment | 暫無(wú)資料 ··· |
MyISAM引擎使用B+Tree 作為索引結(jié)構(gòu),葉節(jié)點(diǎn)的data域存放的是數(shù)據(jù)記錄的地址。
如圖,此索引同樣是一顆B+ 樹(shù),data域保存數(shù)據(jù)記錄的地址,因此,MyISAM 中索引檢索的算法為首先按照B+樹(shù)搜素算法搜素索引,如果指定的Key存在,則取出其data域中的值,然后以data域中的值為地址,讀取相應(yīng)數(shù)據(jù)記錄。
MyISAM的索引方式也叫做”非聚集“ 的,之所以這么稱(chēng)呼是為了與INNODB的聚集索引區(qū)分。
InnoDB的索引也是使用B+Tree作為索引結(jié)構(gòu),但是具體的實(shí)現(xiàn)方式與MyISAM截然不同。
區(qū)別:
可以看到葉節(jié)點(diǎn)包含了完整的數(shù)據(jù)記錄。這種索引叫做聚集索引。因?yàn)镮nnoDB的數(shù)據(jù)文件本身要按主鍵聚集,所以InnoDB要求表必須有主鍵(MyISAM可以沒(méi)有),如果沒(méi)有顯式指定,則MySQL系統(tǒng)會(huì)自動(dòng)選擇一個(gè)可以唯一標(biāo)識(shí)數(shù)據(jù)記錄的列作為主鍵,如果不存在這種列,則MySQL自動(dòng)為InnoDB表生成一個(gè)隱含字段作為主鍵,這個(gè)字段長(zhǎng)度為6個(gè)字節(jié),類(lèi)型為長(zhǎng)整形。
聚集索引這種實(shí)現(xiàn)方式使得按主鍵的搜索十分高效,但是輔助索引搜索需要檢索兩遍索引:首先檢索輔助索引獲得主鍵,然后用主鍵到主索引中檢索獲得記錄。
為什么說(shuō)不建議使用過(guò)長(zhǎng)的字段作為主鍵?
答:因?yàn)樗休o助索引都引用主索引,過(guò)長(zhǎng)的主索引會(huì)令輔助索引變得過(guò)大。
用非單調(diào)的字段作為主鍵在InnoDB中不是個(gè)好主意
InnoDB數(shù)據(jù)文件本身是一顆B+Tree,非單調(diào)的主鍵會(huì)造成在插入新記錄時(shí)數(shù)據(jù)文件為了維持B+Tree的特性而頻繁的分裂調(diào)整,十分低效,而使用自增字段作為主鍵則是一個(gè)很好的選擇。
聯(lián)系客服