mysql中索引的使用

2021-08-26 21:45:16 字數 2879 閱讀 5091

索引是加速查詢的主要手段,特別對於涉及多個表的查詢更是如此。本節中,將介紹索引的作用、特點,以及建立和刪除索引的語法。

索引是快速定位資料的技術,首先通過乙個示例來了解其含義及作用,詳細的介紹請參考第14章。

1.索引示例

假設對於10.3節所建的表,各個表上都沒有索引,資料的排列也沒有規律,如表13.3所示。

表13.3沒有索引的students表

sidsname

sgender

sage

52zhangm21

22wangm22

33lif19

41zhaom20

......

...

當查詢某個學生資訊時,必須順序檢視表students中的每一行,檢查是否與所需值匹配,這需要掃瞄全表,效率很低。

表13.4給出了在name列上增加了索引的students表。

表13.4在name列上增加了索引的students表

索引是在name上排序的。現在,當查詢某個學生資訊時,就不需要逐行搜尋全表,可以利用索引進行有序查詢(如二分查詢法),並快速定位到匹配的值,以節省大量搜尋時間。

2.索引作用

在索引列上,除了上面提到的有序查詢之外,資料庫利用各種各樣的快速定位技術,能夠大大提高查詢效率。特別是當資料量非常大,查詢涉及多個表時,使用索引往往能使查詢速度加快成千上萬倍。

例如,有3個未索引的表t1、t2、t3,分別只包含列c1、c2、c3,每個表分別含有1000行資料組成,指為1~1000的數值,查詢對應值相等行的查詢如下所示。

select c1,c2,c3 from t1,t2,t3 where c1=c2 and c1=c3

此查詢結果應該為1000行,每行包含3個相等的值。在無索引的情況下處理此查詢,必須尋找3個表所有的組合,以便得出與where子句相配的那些行。而可能的組合數目為1000×1000×1000(十億),顯然查詢將會非常慢。

如果對每個表進行索引,就能極大地加速查詢程序。利用索引的查詢處理如下。

(1)從表t1中選擇第一行,檢視此行所包含的資料。

(2)使用表t2上的索引,直接定位t2中與t1的值匹配的行。類似,利用表t3上的索引,直接定位t3中與來自t1的值匹配的行。

(3)掃瞄表t1的下一行並重複前面的過程,直到遍歷t1中所有的行。

在此情形下,仍然對錶t1執行了乙個完全掃瞄,但能夠在表t2和t3上進行索引查詢直接取出這些表中的行,比未用索引時要快一百萬倍。

利用索引,mysql加速了where子句滿足條件行的搜尋,而在多表連線查詢時,在執行連線時加快了與其他表中的行匹配的速度。

在執行create table語句時可以建立索引,也可以單獨用create index或alter table來為表增加索引。

1.alter table

alter table用來建立普通索引、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)

其中table_name是要增加索引的表名,column_list指出對哪些列進行索引,多列時各列之間用逗號分隔。索引名index_name可選,預設時,mysql將根據第乙個索引列賦乙個名稱。另外,alter table允許在單個語句中更改多個表,因此可以在同時建立多個索引。

2.create index

create index可對表增加普通索引或unique索引。

create index index_name on table_name (column_list)

create unique index index_name on table_name (column_list)

table_name、index_name和column_list具有與alter table語句中相同的含義,索引名不可選。另外,不能用create index語句建立primary key索引。

3.索引型別

在建立索引時,可以規定索引能否包含重複值。如果不包含,則索引應該建立為primary key或unique索引。對於單列惟一性索引,這保證單列不包含重複的值。對於多列惟一性索引,保證多個值的組合不重複。

primary key索引和unique索引非常類似。事實上,primary key索引僅是乙個具有名稱primary的unique索引。這表示乙個表只能包含乙個primary key,因為乙個表中不可能具有兩個同名的索引。

下面的sql語句對students表在sid上新增primary key索引。

alter table students add primary key (sid)

可利用alter table或drop index語句來刪除索引。類似於create index語句,drop index可以在alter table內部作為一條語句處理,語法如下。

drop index index_name on talbe_name

alter table table_name drop index index_name

alter table table_name drop primary key

其中,前兩條語句是等價的,刪除掉table_name中的索引index_name。

第3條語句只在刪除primary key索引時使用,因為乙個表只可能有乙個primary key索引,因此不需要指定索引名。如果沒有建立primary key索引,但表具有乙個或多個unique索引,則mysql將刪除第乙個unique索引。

如果從表中刪除了某列,則索引會受到影響。對於多列組合的索引,如果刪除其中的某列,則該列也會從索引中刪除。如果刪除組成索引的所有列,則整個索引將被刪除。

MySQL中索引的使用

語法 create table table name 屬性名 資料型別 約束條件 屬性名 資料型別 約束條件 unique fulltext spatial index key 別名 屬性名 asc desc 建立普通索引 普通索引 create table score id int auto in...

mysql中索引的使用

我們在使用sql時,在遇到sql效能下降 執行時間長時,就需要考慮用索引來幫我們解決問題。如,資料過多,關聯太多的表等。建立索引 create index idx name age address on student name,age,address create table student id...

mysql欄位簡索引 MySQL中索引使用簡例

一張表最多不超過4個索引 某個欄位的值離散度越高,該字段越適合做索引的關鍵字。占用儲存空間少的字段更適合選做索引的關鍵字。較頻繁的作為where查詢條件的字段應該建立索引,分組字段或者排序字段應該建立索引,兩個表的連線字段應該建立索引。更新頻繁的字段不適合做索引,不會出現在where中的字段不應該建...