天天看點

資料庫查詢優化——Mysql索引

版權聲明:本文為部落客原創文章,轉載注明出處http://blog.csdn.net/u013142781

對于任何dbms,索引都是進行優化的最主要的因素。對于少量的資料,沒有合适的索引影響不是很大,但是,當随着資料量的增加,性能會急劇下降。

小寶鴿試了一下,2.5萬資料單表中,無索引:200ms-700ms,添加索引後10ms-15ms,使用redis緩存1ms-7ms,如果資料量更大的時候,索引效果将會更加明顯。更甚者,多表查詢。

1、除了詞典,生活中随處可見索引的例子,如火車站的車次表、圖書的目錄等。它們的原理都是一樣的,通過不斷的縮小想要獲得資料的範圍來篩選出最終想要的結果,同時把随機的事件變成順序的事件,也就是我們總是通過同一種查找方式來鎖定資料。

2、另外,比如學生資訊表,添加學生姓名索引,索引是在name上排序的。現在,當查找某個學生資訊時,就不需要逐行搜尋全表,可以利用索引進行有序查找(如二分查找法),并快速定位到比對的值,以節省大量搜尋時間。

3、是當資料量非常大,查詢涉及多個表時,使用索引往往能使查詢速度加快成千上萬倍。 

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

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

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

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

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

(3)掃描表t1的下一行并重複前面的過程,直到周遊t1中所有的行。

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

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

mysql的索引包括普通索引、唯一性索引、全文索引、單列索引、多列索引和空間索引等。

1.普通索引

在建立普通索引時,不附加任何限制條件。這類索引可以建立在任何資料類型中,其值是否唯一和非空由字段本身的完整性限制條件決定。建立索引以後,查詢時可以通過索引進行查詢。例如,在student表的stu_id字段上建立一個普通索引。查詢記錄時,就可以根據該索引進行查詢。

2.唯一性索引

使用unique參數可以設定索引為唯一性索引。在建立唯一性索引時,限制該索引的值必須是唯一的。例如,在student表的stu_name字段中建立唯一性索引,那麼stu_name字段的值就必需是唯一的。通過唯一性索引,可以更快速地确定某條記錄。主鍵就是一種特殊唯一性索引。

3.全文索引

使用fulltext參數可以設定索引為全文索引。全文索引隻能建立在char、varchar或text類型的字段上。查詢資料量較大的字元串類型的字段時,使用全文索引可以提高查詢速度。例如,student表的information字段是text類型,該字段包含了很多的文字資訊。在information字段上建立全文索引後,可以提高查詢information字段的速度。mysql資料庫從3.23.23版開始支援全文索引,但隻有myisam存儲引擎支援全文檢索。在預設情況下,全文索引的搜尋執行方式不區分大小寫。但索引的列使用二進制排序後,可以執行區分大小寫的全文索引。

4.單列索引

在表中的單個字段上建立索引。單列索引隻根據該字段進行索引。單列索引可以是普通索引,也可以是唯一性索引,還可以是全文索引。隻要保證該索引隻對應一個字段 即可。

5.多列索引

多列索引是在表的多個字段上建立一個索引。該索引指向建立時對應的多個字段,可以通過這幾個字段進行查詢。但是,隻有查詢條件中使用了這些字段中第一個字段時,索引才會被使用。例如,在表中的id、name和sex字段上建立一個多列索引,那麼,隻有查詢條件使用了id字段時該索引才會被使用。

6.空間索引

使用spatial參數可以設定索引為空間索引。空間索引隻能建立在空間資料類型上,這樣可以提高系統擷取空間資料的效率。mysql中的空間資料類型包括geometry和point、linestring和polygon等。目前隻有myisam存儲引擎支援空間檢索,而且索引的字段不能為空值。對于初學者來說,這類索引很少會用到。

1.添加primary key(主鍵索引)

2.添加unique(唯一索引)

3.添加index(普通索引)

4.添加fulltext(全文索引)

5.添加多列索引

建立索引

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

1.alter table

alter table用來建立普通索引、unique索引或primary key索引。

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

2.create index

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

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或drop index語句來删除索引。類似于create index語句,drop index可以在alter table内部作為一條語句處理,文法如下。

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

第3條語句隻在删除primary key索引時使用,因為一個表隻可能有一個primary key索引,是以不需要指定索引名。如果沒有建立primary key索引,但表具有一個或多個unique索引,則mysql将删除第一個unique索引。

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

注:一般資料庫預設都會為主鍵生成索引

參考文章: 

<a href="http://edu.cnzz.cn/201305/88671f51.shtml">http://edu.cnzz.cn/201305/88671f51.shtml</a>