mysql資料庫索引的優缺點以及建立方法

2021-08-28 04:00:51 字數 3511 閱讀 1841

這是因為建立索引可以大大提高系統的效能。

通過建立唯一性索引,可以保證資料庫表中每一行資料的唯一性。

可以大大加快資料的檢索速度,這也是建立索引的最主要的原因。

可以加速表和表之間的連線,特別是在實現資料的參考完整性方面特別有意義。

在使用分組和排序子句進行資料檢索時,同樣可以顯著減少查詢中分組和排序的時間。

為什麼不單一的對每個表的每一列建立索引呢?

建立索引和維護索引要耗費時間,這種時間隨著資料量的增加而增加。

索引需要佔物理空間,除了資料表站資料空間之外,每乙個索引還要佔一定的物理空間,如果建立聚簇索引,那麼需要的空間就會更大。

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

索引是建立在資料庫表中的某些列的上面。因此,在建立索引的時候,應該考慮在哪些列上可以建立索引,在哪些列上不能建立索引。一般來說,應該在這些列上建立索引,例如:

在經常需要搜尋的列上,可以加快搜尋的速度;

在作為主鍵的列上,強制該列的唯一性和組織表中資料的排列結構;

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

在經常需要根據範圍進行搜尋的列上建立索引,因為索引已經排序,其指定的範圍是連續的;

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

在經常使用在where字句中的列上面建立索引,加快條件的判斷速度。

同樣,對於有些列不應該建立索引。一般來說,不應該建立索引的這些列具有下列特點:

對於那些在查詢中很少使用或者參考的列不應該建立索引。這是因為,既然這些列很少使用到,因此有索引或者無索引,並不能提高查詢速度。相反,由於增加了索引,反而降低了系統的維護速度和增大了空間需求。

對於那些只有很少資料值的列也不應該增加索引。這是因為,由於這些列的取值很少,例如人事表的性別列,在查詢的結果中,結果集的資料行佔了表中資料行的很大比例,即需要在表中搜尋的資料行的比例很大,增加索引,並不能明顯加快檢索速度。

對於那些定義為text和bit資料型別的列不應該增加索引。這是因為這些列的資料量要麼相當大,要麼取值很少。

當修改效能遠遠大於檢索效能時,不應該建立索引。這是因為,修改效能和檢索效能是互相矛盾的。當增加索引時,會提高檢索效能,但是會降低修改效能。當減少索引時,會提高修改效能,降低檢索效能。因此,當修改效能遠遠大於檢索效能時,不應該建立索引。

(1)普通索引

這是最基本的索引,它沒有任何限制。它有以下幾種建立方式:

建立索引

create index indexname on mytable(username(length));
如果是char,vchar型別,length可以小於字段實際長度;

如果是blob和text型別,必須指定length,下同。

修改表結構

alter mytable add index [indexname] on (username(length))
建立表的時候直接指定

create table mytable( id int not null,username varchar(16) not null,index[indexname](username(length));
刪除索引的語法

drop index [indexname] on mytable;
(2)唯一索引

它與前面的普通索引類似,不同的就是:索引列的值必須唯一,但允許有空值。如果是組合索引,則列值得組合必須唯一。

它有以下幾種建立方式:

建立索引

create unique index indexname on mytable(username(length));
修改表結構

alter mytable add unique [indexname] on (username(length));
建立表的時候直接指定

create table mytable( id int not null,username varchar(16) not null,unique[indexname](username(length)));
(3)主鍵索引

它是一種特殊的唯一索引,不允許有空值。

一般是在建表的時候同時建立主鍵索引:

create table mytable( id int not null, username varchar(16) not null, primary key(id));
當然也可以用alter命令。

記住:乙個表只有乙個主鍵。
(4)組合索引為了形象的對比單列索引和組合索引,為表新增多個字段:

create table mytable( id intnot null, username varchar(16) not null , city varchar(50) not null, age int not null);
為了進一步榨取mysql的效率,就要考慮建立組合索引。

就是將name,city,age建到乙個索引裡:

alter table mytable add index name_city_age (name(10),city,age);
建表時,username長度為16,這裡用10.

這是因為一般情況下名字的長度不會超過10,這樣會加速索引查詢速度,還會減少索引檔案的大小,提高inser的更新速度。

如果分別在username,city,age上建立單列索引,讓該錶有3個單列索引,查詢時和上述的

組合索引效率也會大不一樣,遠遠低於我們的組合索引。

雖然此時有了三個索引,但mysql只能用到其中的那個他認為似乎是最有效率的單列索引。

建立這樣的組合索引,其實是相當於分別建立下面三組組合索引:username,city,age,username,city username 為什麼沒有city,age這樣的組合索引呢?這是因為mysql組合索引「最左字首」的結果。簡單的理解就是只從最左邊的開始組合。並不是只要包含這三列的查詢都會用到該組合索引,下面幾個sql就會用到這個組合索引:

select * from mytable where username="admin" and city="鄭州" ;

select * from mytable whree username="admin" ;

而下面幾個則不會用到:

select * from mytable whree age=20 and city="鄭州";

select * from mytable whree city="鄭州"

資料庫索引優缺點

建立索引的優點 建立索引可以大大提高系統效能!具體如下 1.通過建立唯一性索引,可以保證資料庫表中每一行資料的唯一性。2.可以大大加快資料的檢索速度,這也是建立索引的最主要的原因。3.可以加速表和表之間的連線,特別是在實現資料的參考完整性方面特別有意義。4.在使用分組和排序子句進行資料檢索時,同樣可...

資料庫索引優缺點

建立索引可以大大提高系統的效能 第一,通過建立唯一性索引,可以保證資料庫表中每一行資料的唯一性。第二,可以大大加快資料的檢索速度,這也是建立索引的最主要的原因。第三,可以加速表和表之間的連線,特別是在實現資料的參考完整性方面特別有意義。第四,在使用分組和排序 子句進行資料檢索時,同樣可以顯著減少查詢...

資料庫索引的優缺點

建立索引可以大大提高系統的效能 第一,通過建立唯一性索引,可以保證資料庫表中每一行資料的唯一性。第二,可以大大加快資料的檢索速度,這也是建立索引的最主要的原因。第三,可以加速表和表之間的連線,特別是在實現資料的參考完整性方面特別有意義。第四,在使用分組和排序 子句進行 資料檢索 時,同樣可以顯著減少...