sql索引的優缺點

2021-08-13 10:50:31 字數 4334 閱讀 5496

一、為什麼要建立索引呢(優點)?

建立索引可以大大提高系統的效能。

第一,   通過建立唯一性索引,可以保證資料庫

表中每一行資料的唯一性。

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

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

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

第五,   通過使用索引,可以在查詢的過程中,使用優化隱藏器,提高系統的效能。

二、建立方向索引的不利因素(缺點)

也許會有人要問:增加索引有如此多的優點,為什麼不對錶中的每乙個列建立乙個索引呢?這種想法固然有其合理性,然而也有其片面性。雖然,索引有許多優點,但是,為表中的每乙個列都增加索引,是非常不明智的。這是因為,增加索引也有許多不利的乙個方面。

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

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

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

三、建立方向索引的準則

索引是建立在資料庫表中的某些列的上面。因此,在建立索引的時候,應該仔細考慮在哪些列上可以建立索引,在哪些列上不能建立索引。

一般來說,應該在這些列上建立索引。

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

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

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

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

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

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

sql中的索引分為兩種,一種為聚集索引和非聚集索引,下面介紹兩者的異同。

1、聚集索引:

聚集索引的意思可以理解為順序排列,比如乙個主鍵自增的錶即為聚集索引,即id為1的存在於第一條,id為2的存在於第二條...假使資料庫中是使用陣列來存放的這張表中的資料,那麼如果我需要查詢第100條,那麼直接第一條資料的位址加上100即為第一百條的位址,一次就能查詢出來。

因為資料庫中的資料只能按照乙個順序進行排列,所以聚集索引乙個資料庫只能有乙個。在mysql中,不能自己建立聚集索引,主鍵即為聚集索引,如果沒有建立主鍵,那麼預設非空的列為聚集索引,如果沒有非空的列那麼會自動生成乙個隱藏列為聚集索引。

所以一般在mysql中,我們建立的主鍵即為聚集索引,資料是按照我們的主鍵順序進行排列。所以在根據主鍵進行查詢時會非常快。

2、非聚集索引:

非聚集索引可以簡單理解為有序目錄,是一種以空間換取時間的方法。舉個例子,在乙個user表中,有乙個id_num,即身份號,此不為主鍵id,那麼這些資料在儲存的時候都是無序的,比如

id為1的id_num為100,id為2的id_num為97,id為3的id_num為98,id為4的id_num為99,id為5的id_num為96。。。id為67的id_num為56。。。

那麼如果我要查詢id_num為56的人,那麼只能一條一條的遍歷,n條就需要查詢n次,時間複雜度為o(n),這是非常耗費效能的。

所以,現在就需要為id_num增加非聚集索引,新增了非聚集索引後,會給id_num進行排序(內部使用結構為b+樹),並且排序後,我只需要查詢此目錄(即查詢b+樹),很快就知道為id為56的在資料庫中的第67條,而不需要在去遍歷表中的所有資料。

所以,在非聚集索引中,不重複的資料越多,那麼索引的效率越高。

我們平常在資料庫中使用的索引一般非聚集索引,下面介紹其使用方法:

1、建立索引:

1.1、建立普通索引:

模式:create index 索引名 on 表名(列名1,列名2,...);

或者修改表: alter table 表名add index 索引名 (列名1,列名2,...);

或者建立表時指定索引:create table 表名 ( [...], index 索引名 (列名1,列名 2,...) );

eg:create index name_index on index_test(name);

此為在index_test表上的name列上建立乙個索引name_index。

測試的表為:

create table index_test (

id int  not null,

name varchar(50),

idnum int,

primary key (id)

);1.2、建立唯一索引:

表示唯一的,不允許重複的索引,如果該欄位資訊保證不會重複例如身份證號用作索引時,可設定為unique

下面三種模式都可以建立唯一索引:

1、建立索引:create unique index 索引名 on 表名(列的列表);

2、在表上增加索引:alter table 表名add unique 索引名 (列的列表);

3、建立表時指定索引:create table 表名( [...], unique 索引名 (列的列表) );

eg:create unique index id_num_index on index_test(idnum);

也可以寫成下面的形式:

alter table index_test add unique id_num_index(idnum);

此為在index_test表的idnum列上建立乙個唯一索引id_num_index

在建立了唯一索引之後,列中即不能重複,比如,現在我給表中插入一條重複的值,會報:

error code: 1062. duplicate entry '3' for key 'id_num_index'

即在id_num_index唯一索引上出現了重複。

2、刪除索引:

以下兩種模式都可以刪除索引:

drop index index_name on talbe_name

alter table table_name drop index index_name

eg:drop index name_index on index_test;

此為刪除在index_test表上的name_index索引                                             

3、檢視索引:

show index from index_test;

即返回index_test表中的所有索引。

在返回的字段中,

table:表的名稱

non_unique:是否不唯一,0為唯一,1不為唯一

key_name:索引的名稱

seq_in_index:索引中的列序列號,從1開始

column_name:列名稱

collation:列以什麼方式儲存在索引中。在mysql中,有值『a』(公升序)或null(無分類)。

cardinality:索引中唯一值的數目的估計值。通過執行analyze table或myisamchk -a可以更新。基數根據被儲存為整數的統計資料來計數,所以即使對於小型表,該值也沒有必要是精確的。基數越大,當進行聯合時,mysql使用該索引的機會就越大。

sub_part:如果列只是被部分地編入索引,則為被編入索引的字元的數目。如果整列被編入索引,則為null。

packed:指示關鍵字如何被壓縮。如果沒有被壓縮,則為null。

null:如果列含有null,則含有yes。如果沒有,則該列含有no。

index_type:用過的索引方法(btree, fulltext, hash, rtree)。

comment:更多評注。

非聚集索引在資料庫建立、增加、刪除、修改的時候都需要作出相應的修改,所以,使用索引也是有一定的原則,即:

1、較頻繁的作為查詢條件的字段應該建立索引

2、重複太多的字段不適合單獨建立索引,即使頻繁作為查詢條件

3、不會出現在where子句中的字段不應該建立索引

以下兩種情況不建議使用索引:

1、表的記錄比較少,比如只有幾百,一千條記錄,那麼沒必要建立索引,直接全表查詢即可。

2、不重複的字段越多,那麼索引的價值越高,檢視不重複的字段佔總體的比例可以使用下面的sql語句:

select count(distinct(name))/count(*) as selectivity from index_test;

比如上面這個sql就是判斷index_test表中name欄位中不重複的值佔整體的比例,這個比例應該在(0,1]之間,這個數值越大,越應該使用索引。

SQL索引的優缺點

索引的優點 1 建立唯一索引,保證資料庫表中每一行資料的唯一性 2 大大加速資料的檢索速度,這也是建立索引的最主要的原因 3 加速表和表至今的連線,特別是在實現資料的參考完整性特別有意義 4 使用分組和排序子句進行資料檢索時,同樣可以減少查詢中分組和排序的時間 5 通過使用索引,可以在查詢的過程中使...

sql索引的優缺點

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

關於sql中索引的優缺點

系統如何訪問表中的資料 一般地,系統訪問資料庫中的資料,可以使用兩種方法 表掃瞄和索引查詢。第一種方法是表掃瞄,就是指系統將指標放置在該錶的表頭資料所在的資料頁上,然後按照資料頁的排列順序,一頁一頁地從前向後掃瞄該錶資料所占有的全部資料頁,直至掃瞄完表中的全部記錄。在掃瞄時,如果找到符合查詢條件的記...