袁崢 鐘新林 許鼎
摘 要:隨著互聯(lián)網(wǎng)的發(fā)展,越來(lái)越多人或中小型公司開(kāi)發(fā)時(shí)選用MySQL做持久化存儲(chǔ),所以對(duì)MySQL有大概的了解是十分有必要的。
關(guān)鍵詞:MySQL;數(shù)據(jù)庫(kù);安全;優(yōu)化;
在寫(xiě)Mysql前,需要先對(duì)數(shù)據(jù)庫(kù)有一定的了解,數(shù)據(jù)庫(kù)是以一定方式儲(chǔ)存在一起、能與多個(gè)用戶(hù)共享、具有盡可能小的冗余度、與應(yīng)用程序彼此獨(dú)立的數(shù)據(jù)集合,可視為電子化的文件柜——存儲(chǔ)電子文件的處所,用戶(hù)可以對(duì)文件中的數(shù)據(jù)進(jìn)行新增、查詢(xún)、更新、刪除等操作。隨著時(shí)代的發(fā)展,大數(shù)據(jù)的到來(lái),出現(xiàn)了非關(guān)系型數(shù)據(jù)庫(kù)NoSQL(Not only SQL),傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)如Mysql等依然保持著強(qiáng)大的生命力。兩種數(shù)據(jù)庫(kù)在存儲(chǔ)方式、存儲(chǔ)結(jié)構(gòu)、存儲(chǔ)規(guī)范等方面都有區(qū)別,應(yīng)該按照存儲(chǔ)數(shù)據(jù)的數(shù)量,并發(fā)量、性能來(lái)選擇合適的數(shù)據(jù)庫(kù)。
一、優(yōu)化
MySQL的安裝和使用難度不大,網(wǎng)上教程繁多,MySQL語(yǔ)句簡(jiǎn)單易懂,但是數(shù)據(jù)庫(kù)表和SQL語(yǔ)句的設(shè)計(jì)影響著數(shù)對(duì)據(jù)庫(kù)的操作性能,分鐘級(jí)別的響應(yīng)經(jīng)過(guò)表和語(yǔ)句的優(yōu)化可降到毫秒級(jí)別,主要的優(yōu)化手段有加索引、分表、SQL語(yǔ)句優(yōu)化等,這些方法一般都是采用存儲(chǔ)空間換相應(yīng)速度或者反過(guò)來(lái),所以設(shè)計(jì)數(shù)據(jù)庫(kù)時(shí)需要根據(jù)實(shí)際所需。
二、優(yōu)點(diǎn)
MySQL的優(yōu)點(diǎn)主要表現(xiàn)在性能的卓越穩(wěn)定,較少出現(xiàn)異常宕機(jī)的情況,源代碼的開(kāi)源和免費(fèi),因此使用起來(lái)費(fèi)用成本低。MySQL社區(qū)的活躍,sql語(yǔ)句的簡(jiǎn)單使得學(xué)習(xí)門(mén)檻低。軟件體積,安裝簡(jiǎn)單,易于維護(hù),因此運(yùn)維成本低。使用C和C++編寫(xiě),并使用多種編譯器進(jìn)行測(cè)試,保證源代碼的可移植性,可部署多種操作系統(tǒng),API接口豐富,支持多種開(kāi)發(fā)語(yǔ)言,存儲(chǔ)引擎豐富。
三、缺點(diǎn)
MySQL的安全性不如收費(fèi)數(shù)據(jù)庫(kù)的安全性高,但由于MySQL代碼開(kāi)源,許多公司會(huì)對(duì)MySQL底層做相關(guān)的優(yōu)化。Mysql不支持熱備份,當(dāng)發(fā)生故障時(shí),對(duì)數(shù)據(jù)庫(kù)回復(fù)時(shí)間點(diǎn)有限制,MySQL也不支持自定義數(shù)據(jù)類(lèi)型、對(duì)XML支持不夠良好、對(duì)存儲(chǔ)過(guò)程和觸發(fā)器支持不夠良好等,但是都有相應(yīng)的優(yōu)化方案,依然不減MySQL受歡迎程度。
四、索引詳解
索引使用的是否恰當(dāng)直接影響到了MySQL性能,所以對(duì)索引有一定認(rèn)識(shí)是非常重要的。什么是索引?為什么要建立索引?索引用于快速找出在某個(gè)列中有一特定值的行,不使用索引,MySQL必須從第一條記錄開(kāi)始讀完整個(gè)表,直到找出相關(guān)的行,表越大,查詢(xún)數(shù)據(jù)所花費(fèi)的時(shí)間就越多,如果表中查詢(xún)的列有一個(gè)索引,MySQL能夠快速到達(dá)一個(gè)位置去搜索數(shù)據(jù)文件,而不必查看所有數(shù)據(jù),那么將會(huì)節(jié)省很大一部分時(shí)間。例如:有一張person表,其中有2萬(wàn)條記錄,記錄著2萬(wàn)個(gè)人的信息。有一個(gè)Phone的字段記錄每個(gè)人的電話(huà)號(hào)碼,現(xiàn)在想要查詢(xún)出電話(huà)號(hào)碼為xxxx的人的信息。如果沒(méi)有索引,那么將從表中第一條記錄一條條往下遍歷,直到找到該條信息為止。如果有了索引,那么會(huì)將該P(yáng)hone字段,通過(guò)一定的方法進(jìn)行存儲(chǔ),好讓查詢(xún)?cè)撟侄紊系男畔r(shí),能夠快速找到對(duì)應(yīng)的數(shù)據(jù),而不必在遍歷2萬(wàn)條數(shù)據(jù)了。其中MySQL中的索引的存儲(chǔ)類(lèi)型有兩種:BTREE、HASH。也就是用樹(shù)或者Hash值來(lái)存儲(chǔ)該字段,索引的工作原理要理解MySQL中索引的工作原理,最簡(jiǎn)單的方法就是去看一看一本書(shū)的索引部分:比如你想在一本書(shū)中尋找某個(gè)主題,一般會(huì)先看書(shū)的索引目錄,找到對(duì)應(yīng)的章節(jié)、對(duì)應(yīng)的頁(yè)碼后就可以快速找到你想看的內(nèi)容。在MySQL中,存儲(chǔ)引擎用類(lèi)似的方法使用索引,其先在索引中查找對(duì)應(yīng)的值,然后根據(jù)匹配的索引記錄找到對(duì)應(yīng)的數(shù)據(jù)行,最后將數(shù)據(jù)結(jié)果集返回給客戶(hù)端。因此使用索引的優(yōu)點(diǎn)是所有的MySql列類(lèi)型(字段類(lèi)型)都可以被索引,也就是可以給任意字段設(shè)置索引、大大加快數(shù)據(jù)的查詢(xún)速度。但缺點(diǎn)是創(chuàng)建索引和維護(hù)索引要耗費(fèi)時(shí)間,并且隨著數(shù)據(jù)量的增加所耗費(fèi)的時(shí)間也會(huì)增加,索引也需要占空間,我們知道數(shù)據(jù)表中的數(shù)據(jù)也會(huì)有最大上線(xiàn)設(shè)置的,如果我們有大量的索引,索引文件可能會(huì)比數(shù)據(jù)文件更快達(dá)到上線(xiàn)值,當(dāng)對(duì)表中的數(shù)據(jù)進(jìn)行增加、刪除、修改時(shí),索引也需要?jiǎng)討B(tài)的維護(hù),降低了數(shù)據(jù)的維護(hù)速度。所以應(yīng)遵守一定的使用原則比如通過(guò)上面說(shuō)的優(yōu)點(diǎn)和缺點(diǎn),我們應(yīng)該可以知道,并不是每個(gè)字段度設(shè)置索引就好,也不是索引越多越好,而是需要自己合理的使用,對(duì)經(jīng)常更新的表就避免對(duì)其進(jìn)行過(guò)多的索引,對(duì)經(jīng)常用于查詢(xún)的字段應(yīng)該創(chuàng)建索引,數(shù)據(jù)量小的表最好不要使用索引,因?yàn)橛捎跀?shù)據(jù)較少,可能查詢(xún)?nèi)繑?shù)據(jù)花費(fèi)的時(shí)間比遍歷索引的時(shí)間還要短,索引就可能不會(huì)產(chǎn)生優(yōu)化效果,在一同值少的列上(字段上)不要建立索引,比如在學(xué)生表的"性別"字段上只有男,女兩個(gè)不同值。相反的,在一個(gè)字段上不同值較多可以建立索引。索引是在存儲(chǔ)引擎中實(shí)現(xiàn)的,也就是說(shuō)不同的存儲(chǔ)引擎,會(huì)使用不同的索引,MyISAM和InnoDB存儲(chǔ)引擎:只支持BTREE索引,也就是說(shuō)默認(rèn)使用BTREE,不能夠更換MEMORY/HEAP存儲(chǔ)引擎:支持HASH和BTREE索引,索引我們分為四類(lèi)來(lái)講有單列索引(普通索引,唯一索引,主鍵索引)、組合索引、全文索引、空間索引。
五、總結(jié)
數(shù)據(jù)庫(kù)設(shè)計(jì)的質(zhì)量會(huì)直接影響到軟件開(kāi)發(fā)的進(jìn)度和質(zhì)量,由上述總結(jié)出MySQL成本低、性能強(qiáng),以開(kāi)發(fā)文檔、社區(qū)論壇、源代碼為基礎(chǔ)上做數(shù)據(jù)庫(kù)開(kāi)發(fā)便可滿(mǎn)足絕大多數(shù)需求并容易對(duì)遇到的問(wèn)題找到解決方案。