帶你了解10個(gè)MySQL數(shù)據(jù)庫(kù)技巧(一)
無(wú)論是運(yùn)維、開發(fā)、測(cè)試,還是架構(gòu)師,數(shù)據(jù)庫(kù)技術(shù)是一個(gè)必備加薪神器,那么,一直說學(xué)習(xí)數(shù)據(jù)庫(kù)、學(xué)MySQL,到底是要學(xué)習(xí)它的哪些東西呢?
01 如何快速掌握MySQL?
培養(yǎng)興趣
興趣是***的老師,不論學(xué)習(xí)什么知識(shí),興趣都可以極大地提高學(xué)習(xí)效率。當(dāng)然學(xué)習(xí)MySQL 5.6也不例外。
夯實(shí)基礎(chǔ)
計(jì)算機(jī)領(lǐng)域的技術(shù)非常強(qiáng)調(diào)基礎(chǔ),剛開始學(xué)習(xí)可能還認(rèn)識(shí)不到這一點(diǎn),隨著技術(shù)應(yīng)用的深 入,只有有著扎實(shí)的基礎(chǔ)功底,才能在技術(shù)的道路上走得更快、更遠(yuǎn)。對(duì)于MySQL的學(xué)習(xí)來(lái)說, SQL語(yǔ)句是其中最為基礎(chǔ)的部分,很多操作都是通過SQL語(yǔ)句來(lái)實(shí)現(xiàn)的。所以在學(xué)習(xí)的過程中, 讀者要多編寫SQL語(yǔ)句,對(duì)于同一個(gè)功能,使用不同的實(shí)現(xiàn)語(yǔ)句來(lái)完成,從而深刻理解其不同之處。
及時(shí)學(xué)習(xí)新知識(shí)
正確、有效地利用搜索引擎,可以搜索到很多關(guān)于MySQL 5.6的相關(guān)知識(shí)。同時(shí),參考別 人解決問題的思路,也可以吸取別人的經(jīng)驗(yàn),及時(shí)獲取***的技術(shù)資料。
多實(shí)踐操作
數(shù)據(jù)庫(kù)系統(tǒng)具有極強(qiáng)的操作性,需要多動(dòng)手上機(jī)操作。在實(shí)際操作的過程中才能發(fā)現(xiàn)問題, 并思考解決問題的方法和思路,只有這樣才能提高實(shí)戰(zhàn)的操作能力。
02 如何選擇服務(wù)器的類型?
MySQL服務(wù)器配置窗口中各個(gè)參數(shù)的含義如下。
【Server Configuration Type】該選項(xiàng)用于設(shè)置服務(wù)器的類型。單擊該選項(xiàng)右側(cè)的向下按鈕, 即可看到包括3個(gè)選項(xiàng)。
3個(gè)選項(xiàng)的具體含義如下:
- Development Machine(開發(fā)機(jī)器):該選項(xiàng)代表典型個(gè)人用桌面工作站。假定機(jī)器上運(yùn)行 著多個(gè)桌面應(yīng)用程序。將MySQL服務(wù)器配置成使用最少的系統(tǒng)資源。
- Server Machine (服務(wù)器):該選項(xiàng)代表服務(wù)器,MySQL服務(wù)器可以同其它應(yīng)用程序一起 運(yùn)行,例如FTP、email和web服務(wù)器。MySQL服務(wù)器配置成使用適當(dāng)比例的系統(tǒng)資源。
- DedicatedMySQL Server Machine (專用 MySQL 服務(wù)器):該選項(xiàng)代表只運(yùn)行MySQL服務(wù)的服務(wù)器。假定運(yùn)行沒有運(yùn)行其它應(yīng)用程序。MySQL服務(wù)器配置成使用所有可用系統(tǒng)資源。作為初學(xué)者,建議選擇【DevelopmentMachine】(開發(fā)者機(jī)器)選項(xiàng),這樣占用系統(tǒng)的資源 比較少。
03 如何選擇存儲(chǔ)引擎
不同存儲(chǔ)引擎都有各自的特點(diǎn),以適應(yīng)不同的需求,如下表所示。為了做出選擇:
首先需 要考慮每一個(gè)存儲(chǔ)引擎提供了哪些不同的功能。如果要提供提交,回滾和崩潰恢復(fù)能力的事務(wù)安全(ACID兼容)能力,并要求實(shí)現(xiàn)并發(fā)控 制,InnoDB是個(gè)很好的選擇。如果數(shù)據(jù)表主要用來(lái)插入和查詢記錄,則MyISAM引擎能提供較 高的處理效率;如果只是臨時(shí)存放數(shù)據(jù),數(shù)據(jù)量不大,并且不需要較高的數(shù)據(jù)安全性,可以選擇將數(shù)據(jù)保存在內(nèi)存中的Memory引擎,MySQL中使用該引擎作為臨時(shí)表,存放查詢的中間結(jié)果。如果只有INSERT和SELECT操作,可以選擇Archive引擎,Archive存儲(chǔ)引擎支持高并發(fā)的插 入操作,但是本身并不是事務(wù)安全的。Archive存儲(chǔ)引擎非常適合存儲(chǔ)歸檔數(shù)據(jù),如記錄日志信 息可以使用Archive引擎。
使用哪一種引擎要根據(jù)需要靈活選擇,一個(gè)數(shù)據(jù)庫(kù)中多個(gè)表可以使用不同引擎以滿足各種性能和實(shí)際需求。
使用合適的存儲(chǔ)引擎,將會(huì)提高整個(gè)數(shù)據(jù)庫(kù)的性能。
04 如何查看默認(rèn)存儲(chǔ)引擎?
使用SHOW ENGINES語(yǔ)句查看系統(tǒng)中所有的存儲(chǔ)引擎,其中包括默認(rèn)的存儲(chǔ)引擎??梢钥闯鰜?lái)當(dāng)前數(shù)據(jù)庫(kù)系統(tǒng)中有五種存儲(chǔ)引擎,默認(rèn)是MyISAM。還可以使用一種直接的方法查看默認(rèn)存儲(chǔ)引擎。執(zhí)行結(jié)果直接顯示了當(dāng)前默認(rèn)的存儲(chǔ)引擎為MyISAM。
05 表刪除操作須謹(jǐn)慎
表刪除操作將把表的定義和表中的數(shù)據(jù)一起刪除,并且MySQL在執(zhí)行刪除操作時(shí),不會(huì)有 任何的確認(rèn)信息提示,因此執(zhí)行刪除操時(shí),應(yīng)當(dāng)慎重。在刪除表前,***對(duì)表中的數(shù)據(jù)進(jìn)行備份, 這樣當(dāng)操作失誤時(shí),可以對(duì)數(shù)據(jù)進(jìn)行恢復(fù),以免造成無(wú)法挽回的后果。
同樣的,在使用ALTER TABLE進(jìn)行表的基本修改操作時(shí),在執(zhí)行操作過程之前,也應(yīng)該 確保對(duì)數(shù)據(jù)進(jìn)行完整的備份,因?yàn)閿?shù)據(jù)庫(kù)的改變是無(wú)法撤銷的,如果添加了一個(gè)不需要的字段, 可以將其刪除;相同的,如果刪除了一個(gè)需要的列,該列下面的所有數(shù)據(jù)都將會(huì)丟失。
06 每個(gè)表中都要有一個(gè)主鍵嗎?
并不是每一個(gè)表中都需要主鍵,一般的,如果多個(gè)表之間進(jìn)行連接操作時(shí),需要用到主鍵。 因此并不需要為每個(gè)表建立主鍵,而且有些情況***不使用主鍵。
07 每個(gè)表都可以任意選擇存儲(chǔ)引擎嗎?
外鍵約束(FOREIGN KEY)不能跨引擎使用。MySQL支持多種存儲(chǔ)引擎,每一個(gè)表都可 以指定一個(gè)不同的存儲(chǔ)引擎,但是要注意:外鍵約束是用來(lái)保證數(shù)據(jù)的參照完整性,如果表之間 需要關(guān)聯(lián)外鍵,卻指定了不同的存儲(chǔ)引擎,這些表之間是不能創(chuàng)建外鍵約束的。所以說,存儲(chǔ)引 擎的選擇也不完全是隨意的。
08 帶AUTO_INCREMENT字段值是從1開始嗎?
默認(rèn)的,在MySQL中,AUTO_INCREMENT的初始值是1,每新增一條記錄,字段值自動(dòng)加1。設(shè)置自增屬性(AUTO_INCREMENT)的時(shí)候,還可以指定***條插入記錄的自增字段的 值,這樣新插入的記錄的自增字段值從初始值開始遞增,如在tb_emp8中插入***條記錄,同時(shí) 指定id值為5,則以后插入的記錄的id值就會(huì)從6開始往上增加。添加唯一性的主鍵約束時(shí), 往往需要設(shè)置字段自動(dòng)增加屬性。
09 TIMESTAMP與DATATIME兩者的區(qū)別
TIMESTAMP與DATETIME除了存儲(chǔ)字節(jié)和支持的范圍不同外,還有一個(gè)***的區(qū)別就是: DATETIME在存儲(chǔ)日期數(shù)據(jù)時(shí),按實(shí)際輸入的格式存儲(chǔ),即輸入什么就存儲(chǔ)什么,與時(shí)區(qū)無(wú)關(guān); 而TIMESTAMP值的存儲(chǔ)是以UTC(世界標(biāo)準(zhǔn)時(shí)間)格式保存的,存儲(chǔ)時(shí)對(duì)當(dāng)前時(shí)區(qū)進(jìn)行轉(zhuǎn)換, 檢索時(shí)再轉(zhuǎn)換回當(dāng)前時(shí)區(qū)。即查詢時(shí),根據(jù)當(dāng)前時(shí)區(qū)的不同,顯示的時(shí)間值是不同的。
10 選擇數(shù)據(jù)類型的方法和技巧
MySQL提供了大量的數(shù)據(jù)類型,為了優(yōu)化存儲(chǔ),提高數(shù)據(jù)庫(kù)性能,在任何情況下均應(yīng)使用 最精確的類型。即在所有可以表示該列值的類型中,該類型使用的存儲(chǔ)最少。
- 整數(shù)和浮點(diǎn)數(shù)
如果不需要小數(shù)部分,則使用整數(shù)來(lái)保存數(shù)據(jù);如果需要表示小數(shù)部分,則使用浮點(diǎn)數(shù)類 型。對(duì)于浮點(diǎn)數(shù)據(jù)列,存入的數(shù)值會(huì)對(duì)該列定義的小數(shù)位進(jìn)行四舍五入。例如如果列的值的范 圍為1〜99999,若使用整數(shù),則MEDIUMINT UNSIGNED是***的類型;若需要存儲(chǔ)小數(shù),則 使用FLOAT類型。浮點(diǎn)類型包括FLOAT和DOUBLE類型。DOUBLE類型精度比FLOAT類型高,因此,如要求存儲(chǔ)精度較高時(shí),應(yīng)選擇DOUBLE類型。
- 浮點(diǎn)數(shù)和定點(diǎn)數(shù)
浮點(diǎn)數(shù)FLOAT,DOUBLE相對(duì)于定點(diǎn)數(shù)DECIMAL的優(yōu)勢(shì)是:在長(zhǎng)度一定的情況下,浮點(diǎn) 數(shù)能表示更大的數(shù)據(jù)范圍。但是由于浮點(diǎn)數(shù)容易產(chǎn)生誤差,因此對(duì)精確度要求比較高時(shí),建議使 用DECIMAL來(lái)存儲(chǔ)。DECIMAL在MySQL中是以字符串存儲(chǔ)的,用于定義貨幣等對(duì)精確度要 求較高的數(shù)據(jù)。在數(shù)據(jù)遷移中,float(M,D)是非標(biāo)準(zhǔn)SQL定義,數(shù)據(jù)庫(kù)遷移可能會(huì)出現(xiàn)問題,***不要這樣使用。另外兩個(gè)浮點(diǎn)數(shù)進(jìn)行減法和比較運(yùn)算時(shí)也容易出問題,因此在進(jìn)行計(jì)算的時(shí)候, 一定要小心。如果進(jìn)行數(shù)值比較,***使用DECIMAL類型。
- 日期與時(shí)間類型
MySQL對(duì)于不同種類的日期和時(shí)間有很多的數(shù)據(jù)類型,比如YEAR和TIME。如果只需要 記錄年份,則使用YEAR類型即可;如果只記錄時(shí)間,只須使用TIME類型。如果同時(shí)需要記錄日期和時(shí)間,則可以使用TIMESTAMP或者DATETIME類型。由于 TIMESTAMP列的取值范圍小于DATETIME的取值范圍,因此存儲(chǔ)范圍較大的日期***使用 DATETIME。
TIMESTAMP也有一個(gè)DATETIME不具備的屬性。默認(rèn)的情況下,當(dāng)插入一條記錄但并沒 有指定TIMESTAMP這個(gè)列值時(shí),MySQL會(huì)把TIMESTAMP列設(shè)為當(dāng)前的時(shí)間。因此當(dāng)需要 插入記錄同時(shí)插入當(dāng)前時(shí)間時(shí),使用TIMESTAMP是方便的,另外TIMESTAMP在空間上比 DATETIME更有效。
CHAR與VARCHAR之間的特點(diǎn)與選擇
CHAR和VARCHAR的區(qū)別:
- CHAR是固定長(zhǎng)度字符,VARCHAR是可變長(zhǎng)度字符;CHAR會(huì)自動(dòng)刪除插入數(shù)據(jù)的尾部 空格,VARCHAR不會(huì)刪除尾部空格。
- CHAR是固定長(zhǎng)度,所以它的處理速度比VARCHAR的速度要快,但是它的缺點(diǎn)就是浪費(fèi) 存儲(chǔ)空間。所以對(duì)存儲(chǔ)不大,但在速度上有要求的可以使用CHAR類型,反之可以使用 VARCHAR類型來(lái)實(shí)現(xiàn)。
存儲(chǔ)引擎對(duì)于選擇CHAR和VARCHAR的影響:
- 對(duì)于MyISAM存儲(chǔ)引擎:***使用固定長(zhǎng)度的數(shù)據(jù)列代替可變長(zhǎng)度的數(shù)據(jù)列。這樣可以使 整個(gè)表靜態(tài)化,從而使數(shù)據(jù)檢索更快,用空間換時(shí)間。
- 對(duì)于InnoDB存儲(chǔ)引擎:使用可變長(zhǎng)度的數(shù)據(jù)列,因?yàn)镮nnoDB數(shù)據(jù)表的存儲(chǔ)格式不分固定 長(zhǎng)度和可變長(zhǎng)度,因此使用CHAR不一定比使用VARCHAR更好,但由于VARCHAR是按照 實(shí)際的長(zhǎng)度存儲(chǔ),比較節(jié)省空間,所以對(duì)磁盤I/O和數(shù)據(jù)存儲(chǔ)總量比較好。
ENUM 和 SET
ENUM只能取單值,它的數(shù)據(jù)列表是一個(gè)枚舉集合。它的合法取值列表最多允許有65 535 個(gè)成員。因此,在需要從多個(gè)值中選取一個(gè)時(shí),可以使用ENUM。比如:性別字段適合定義為 ENUM類型,每次只能從’男’或’女’中取一個(gè)值。SET可取多值。它的合法取值列表最多允許有64個(gè)成員。
空字符串也是一個(gè)合法的SET值。 在需要取多個(gè)值的時(shí)候,適合使用SET類型,比如:要存儲(chǔ)一個(gè)人興趣愛好,***使用SET類型。ENUM和SET的值是以字符串形式出現(xiàn)的,但在內(nèi)部,MySQL以數(shù)值的形式存儲(chǔ)它們。
BLOB 和 TEXT
BLOB是二進(jìn)制字符串,TEXT是非二進(jìn)制字符串,兩者均可存放大容量的信息。BLOB主 要存儲(chǔ)圖片、音頻信息等,而TEXT只能存儲(chǔ)純文本文件。應(yīng)分清兩者的用途。