魏再超
引言:在web開發(fā)中,頁面模板,業(yè)務(wù)邏輯(包括緩存、連接池)和數(shù)據(jù)庫這三個部分,數(shù)據(jù)庫在其中負責(zé)執(zhí)行SQL查詢并返回查詢結(jié)果,是影響網(wǎng)站速度最重要的性能瓶頸。本文主要針對MySql數(shù)據(jù)庫,通過使用索引來提升查詢速度。
索引用于快速找出在某個列中有一特定值的行。不使用索引,MySQL將進行全表掃描,從第一條記錄開始然后讀完整個表直到找出相關(guān)的行。
一、mysql索引類型
常用的索引類型有
(1)主鍵索引
它是一種特殊的唯一索引,不允許有空值。一般是在建表的時候同時創(chuàng)建主鍵索引。
(2)普通索引
這是最基本的索引,它沒有任何限制。
(3)唯一索引
它與前面的普通索引類似,不同的就是:索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一。
(4)全文索引
MySQL支持全文索引和搜索功能。MySQL中的全文索引類型為FULLTEXT的索引。FULLTEXT 索引僅可用于 MyISAM表;
二、在什么情況下使用索引
為搜索字段建索引,如果在你的表中,某個字段你經(jīng)常用來做搜索,那么,請為其建立索引吧。一般來說,在WHERE和JOIN中出現(xiàn)的列需要建立索引以提高查詢速度。
三、最常用的存儲引擎:
(1)Myisam存儲引擎:每個Myisam在磁盤上存儲成三個文件。文件名都和表名相同,擴展名分別為.frm(存儲表定義)、.MYD(存儲數(shù)據(jù))、.MYI(存儲索引)。數(shù)據(jù)文 件和索引文件可以放置在不同目錄,平均分布io,獲得更快的速度。對存儲大小沒有限制,MySQL數(shù)據(jù)庫的最大有效表尺寸通常是由操作系統(tǒng)對文件大小的限制決定的。
(2)InnoDB存儲引擎:具有提交、回滾、奔潰恢復(fù)能力的事務(wù)安全。與Myisam相比,InnoDB的寫效率差一些并且會占用更多的磁盤空間以保留數(shù)據(jù)和索引。
(3)如何選擇合適的引擎
下面是常用存儲引擎適用的環(huán)境:
Myisam:它是在Web、數(shù)據(jù)倉儲和其他應(yīng)用環(huán)境下最常使用的存儲引擎;
InnoDB:用于事務(wù)處理應(yīng)用程序,具有更多特性,包括ACID事務(wù)特性。
四、設(shè)計MySql索引的時候有以下幾點注意:
(1)、對于查詢占主要的應(yīng)用來說,索引顯得尤為重要。很多時候性能問題很簡單的就是因為我們忘了添加索引而造成的,或者說沒有添加更為有效的索引導(dǎo)致。如果不加索引的話,那么查找任何哪怕只是一條特定的數(shù)據(jù)都會進行一次全表掃描,如果一張表的數(shù)據(jù)量很大而符合條件的結(jié)果又很少,那么不加索引會引起致命的性能下降。但是也不是什么情況都非得建索引不可,如:表記錄太少,經(jīng)常插入、刪除、修改的表,某個字段只會出現(xiàn)重復(fù)的幾個值,建索引不僅沒什么優(yōu)勢,還會影響到更新速度,這被稱為過度索引。其次,在對建立索引的時候要對表進行加鎖,因此應(yīng)當(dāng)注意操作在業(yè)務(wù)空閑的時候進行。
(2)、還應(yīng)當(dāng)考慮表空間和磁盤空間是否足夠。我們知道索引也是一種數(shù)據(jù),在建立索引的時候勢必也會占用大量表空間。因此在對一大表建立索引的時候首先應(yīng)當(dāng)考慮的是空間容量問題。
(3)、性能調(diào)整方面:首當(dāng)其沖的考慮因素便是磁盤I/O。物理上,應(yīng)當(dāng)盡量把索引與數(shù)據(jù)分散到不同的磁盤上(不考慮陣列的情況)。邏輯上,數(shù)據(jù)表空間與索引表空間分開。這是在建索引時應(yīng)當(dāng)遵守的基本準(zhǔn)則。
參考文獻
[1] http://blog.sina.com.cn/s/blog_40e5b6370100f0vy.html.
[2]高性能MySQL(第3版).電子工業(yè)出版社.Baron Schwartz等著;寧海元等譯.
[3]MySQL技術(shù)內(nèi)幕:InnoDB存儲引擎(第2版).機械工業(yè)出版社. 姜承堯 著.
(作者單位:保山學(xué)院信息學(xué)院)