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