索引的類型分類、區別、優缺點


導讀:索引是在存儲引擎中實現的,也就是說不同的存儲引擎,會使用不同的索引。MyISAM和InnoDB存儲引擎:只支持BTREE索引,也就是說默認使用BTREE,不能夠更換。MEMORY/HEAP存儲引擎:支持HASH和BTREE索引。

mysql的索引我們分為三大類來講單列索引(普通索引,唯一索引,主鍵索引)、組合索引、全文索引。

 

一、單列索引:一個索引只包含單個列,但一個表中可以有多個單列索引。 這里不要搞混淆了

1:普通索引:MySQL中基本索引類型,沒有什么限制,允許在定義索引的列中插入重復值和空值,純粹為了查詢數據更快一 點。

2:唯一索引:索引列中的值必須是唯一的,但是允許為空值。

3:主鍵索引:是一種特殊的唯一索引,不允許有空值。(主鍵約束,就是一個主鍵索引)。

 

主鍵索引與唯一索引的區別

1. 主鍵是一種約束,唯一索引是一種索引,兩者在本質上是不同的。

2. 主鍵創建后一定包含一個唯一性索引,唯一性索引並不一定就是主鍵。

3. 唯一性索引列允許空值,而主鍵列不允許為空值。

4. 主鍵索引在創建時,已經默認為非空值+ 唯一索引了。

5. 一個表最多只能創建一個主鍵索引,但可以創建多個唯一索引。

6. 主鍵更適合那些不容易更改的唯一標識,如自動遞增列、身份證號等。

7. 主鍵可以被其他表引用為外鍵,而唯一索引不能。

 

二、組合索引:在表中的多個字段組合上創建的索引,只有在查詢條件中使用了這些字段的左邊字段時,索引才會被使用,使用組合索引時遵循最左前綴集合。例如,這里由id、name和age3個字段構成的索引,索引行中就按id/name/age的順序存放,索引可以索引下面字段組合(id,name,age)、(id,name)或者(id)。如果要查詢的字段不構成索引最左面的前綴,那么就不會是用索引,比如,age或者(name,age)組合就不會使用索引查詢。

 

 

三、全文索引:全文索引,只有在MyISAM引擎上才能使用,只能在CHAR,VARCHAR,TEXT類型字段上使用全文索引,介紹了要求,說說什么是全文索引,就是在一堆文字中,通過其中的某個關鍵字等,就能找到該字段所屬的記錄行,比如有"你是個大煞筆,二貨 ..." 通過大煞筆,可能就可以找到該條記錄。這里說的是可能,因為全文索引的使用涉及了很多細節,我們只需要知道這個大概意思。一般開發中,不貴用到全文索引,因為其占用很大的物理空間和降低了記錄修改性,故較為少用。

 

創建索引的語句:

1:直接創建索引:

CREATE INDEX index_name ON table(column(length)); 創建普通索引
CREATE UNIQUE INDEX indexName ON table(column(length)); 創建唯一索引
CREATE FULLTEXT INDEX index_content ON article(content); 全文索引

2:修改表結構的方式添加索引:

ALTER TABLE table_name ADD INDEX index_name ON (column(length)); 創建普通索引
ALTER TABLE table_name ADD UNIQUE indexName ON (column(length)); 創建唯一索引
ALTER TABLE `table` ADD INDEX name_city_age (name,city,age); 組合索引
ALTER TABLE article ADD FULLTEXT index_content(content); 全文索引


3:創建表的時候創建索引:

CREATE TABLE `table` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`title` char(255) CHARACTER NOT NULL ,
`content` text CHARACTER NULL ,
`time` int(10) NULL DEFAULT NULL ,
PRIMARY KEY (`id`),
INDEX index_name (title(length))
); 普通索引

CREATE TABLE `table` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`title` char(255) CHARACTER NOT NULL ,
`content` text CHARACTER NULL ,
`time` int(10) NULL DEFAULT NULL ,
UNIQUE indexName (title(length))
); 唯一索引
CREATE TABLE `table` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`title` char(255) NOT NULL ,
PRIMARY KEY (`id`)
); 主鍵索引
CREATE TABLE `table` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`title` char(255) CHARACTER NOT NULL ,
`content` text CHARACTER NULL ,
`time` int(10) NULL DEFAULT NULL ,
PRIMARY KEY (`id`),
FULLTEXT (content)
); 全文索引

4:刪除索引:

DROP INDEX index_name ON table;
5:查看索引:

show index from table_name;

索引的優缺點

1、優點:創建索引可以大大提高系統的性能。
第一、通過創建唯一性索引,可以保證數據庫表中每一行數據的唯一性。
第二、可以大大加快 數據的檢索速度,這也是創建索引的最主要的原因。
第三、可以加速表和表之間的連接,特別是在實現數據的參考完整性方面特別有意義。
第四、在使用分組和排序子句進行數據檢索時,同樣可以顯著減少查詢中分組和排序的時間。
第五、通過使用索引,可以在查詢的過程中,使用優化隱藏器,提高系統的性能。

 

2、缺點:

增加索引有如此多的優點,為什么不對表中的每一個列創建一個索引呢?這是因為,增加索引也有許多不利的一個方面:

第一、創建索引和維護索引要耗費時間,這種時間隨着數據量的增加而增加。

第二、索引需要占物理空間,除了數據表占數據空間之外,每一個索引還要占一定的物理空間。如果要建立聚簇索引,那么 需要的空間就會更大。

第三、當對表中的數據進行增加、刪除和修改的時候,索引也要動態的維護,這樣就降低了數據的維護速度。

哪些字段適合作為索引(不適合作為索引):

 

一般來說,應該在這些列上創建索引,例如:

第一、在經常需要搜索的列上,可以加快搜索的速度;

第二、在作為主鍵的列上,強制該列的唯一性和組織表中數據的排列結構;

第三、在經常用在連接的列上,這些列主要是一些外鍵,可以加快連接的速度;

第四、在經常需要根據范圍進行搜索的列上創建索引,因為索引已經排序,其指定的范圍是連續的;

第五、在經常需要排序的列上創建索引,因為索引已經排序,這樣查詢可以利用索引的排序,加快排序查詢時間;

第六、在經常使用在WHERE子句中的列上面創建索引,加快條件的判斷速度。

什么樣的字段不適合創建索引:

 

第一,對於那些在查詢中很少使用或者參考的列不應該創建索引。這是因為,既然這些列很少使用到,因此有索引或者無索引,

並不能提高查詢速度。相反,由於增加了索引,反而降低了系統的維護速度和增大了空間需求。
第二,對於那些只有很少數據值的列也不應該增加索引。這是因為,由於這些列的取值很少,例如人事表的性別列,

在查詢的結果中,結果集的數據行占了表中數據行的很大比 例,即需要在表中搜索的數據行的比例很大。

增加索引,並不能明顯加快檢索速度。
第三,對於那些定義為text, image和bit數據類型的列不應該增加索引。這是因為,這些列的數據量要么相當大,要么取值很少。
第四,當修改性能遠遠大於檢索性能時,不應該創建索 引。這是因為,修改性能和檢索性能是互相矛盾的。

當增加索引時,會提高檢索性能,但是會降低修改性能。當減少索引時,會提高修改性能,降低檢索性能。

因此,當修改性能遠遠大於檢索性能時,不應該創建索引。
————————————————
版權聲明:本文為CSDN博主「戰之殤」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_38852289/article/details/80817156


免責聲明!

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



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