sql索引見解

2021-08-08 12:36:02 字數 3210 閱讀 2304

索引分為聚集索引和非聚集索引,

聚集索引為主鍵,沒主鍵則為非空列,沒非空列則資料庫自動生成隱藏列,且聚集索引由資料庫自己建立,程式設計師無法干涉。

非聚集索引可以簡單理解為有序目錄,是一種以空間換取時間的方法。舉個例子,在乙個

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 onindex_test(idnum);

也可以寫成下面的形式:

alter table index_test add uniqueid_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

)。

SQL索引見解

其實對於非專業的資料庫操作人員來講,例如軟體開發人員,在很大程度上都搞不清楚資料庫索引的一些基本知識,有些是知其一不知其二,或者是知其然不知其所以然。造成這種情況的主要原因我覺的是行業原因,有很多公司都有自己的dba團隊,他們會幫助你優化sql,開發人員即使不懂優化問題也不大,所以開發人員對這方面也...

SQL索引見解

其實對於非專業的資料庫操作人員來講,例如軟體開發人員,在很大程度上都搞不清楚資料庫索引的一些基本知識,有些是知其一不知其二,或者是知其然不知其所以然。造成這種情況的主要原因我覺的是行業原因,有很多公司都有自己的dba團隊,他們會幫助你優化sql,開發人員即使不懂優化問題也不大,所以開發人員對這方面也...

SQL 索引 建立索引

create index 語句用於在表中建立索引。在不讀取整個表的情況下,索引使資料庫應用程式可以更快地查詢資料。您可以在表中建立索引,以便更加快速高效地查詢資料。使用者無法看到索引,它們只能被用來加速搜尋 查詢。注釋 更新乙個包含索引的表需要比更新乙個沒有索引的表更多的時間,這是由於索引本身也需要...