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