無論是運維、開發、測試,還是架構師,資料庫技術是一個必備加薪神器,那麼,一直說學習資料庫、學MySQL,到底是要學習它的哪些東西呢?此文為你揭曉,你值得一看!看過别忘記點贊+轉發支援哦。
1.如何快速掌握MySQL?
⑴培養興趣
興趣是最好的老師,不論學習什麼知識,興趣都可以極大地提高學習效率。當然學習MySQL 5.6也不例外。
⑵夯實基礎
計算機領域的技術非常強調基礎,剛開始學習可能還認識不到這一點,随着技術應用的深 入,隻有有着紮實的基礎功底,才能在技術的道路上走得更快、更遠。對于MySQL的學習來說, SQL語句是其中最為基礎的部分,很多操作都是通過SQL語句來實作的。是以在學習的過程中, 讀者要多編寫SQL語句,對于同一個功能,使用不同的實作語句來完成,進而深刻了解其不同之處。
(3)及時學習新知識
正确、有效地利用搜尋引擎,可以搜尋到很多關于MySQL 5.6的相關知識。同時,參考别 人解決問題的思路,也可以吸取别人的經驗,及時擷取最新的技術資料。
⑷多實踐操作
資料庫系統具有極強的操作性,需要多動手上機操作。在實際操作的過程中才能發現問題, 并思考解決問題的方法和思路,隻有這樣才能提高實戰的操作能力。
2.如何選擇伺服器的類型?
MySQL伺服器配置視窗中各個參數的含義如下。
【Server Configuration Type】該選項用于設定伺服器的類型。單擊該選項右側的向下按鈕, 即可看到包括3個選項。
3個選項的具體含義如下。
(1) Development Machine(開發機器):該選項代表典型個人用桌面工作站。假定機器上運作 着多個桌面應用程式。将MySQL伺服器配置成使用最少的系統資源。
(2) Server Machine (伺服器):該選項代表伺服器,MySQL伺服器可以同其它應用程式一起 運作,例如FTP、email和web伺服器。MySQL伺服器配置成使用适當比例的系統資源。
(3) DedicatedMySQL Server Machine (專用 MySQL 伺服器):該選項代表隻運作MySQL服務的伺服器。假定運作沒有運作其它應用程式。MySQL伺服器配置成使用所有可用系統資源。作為初學者,建議選擇【DevelopmentMachine】(開發者機器)選項,這樣占用系統的資源 比較少。
3.如何選擇存儲引擎
不同存儲引擎都有各自的特點,以适應不同的需求,如下表所示。為了做出選擇:
1、首先需 要考慮每一個存儲引擎提供了哪些不同的功能。如果要提供送出,復原和崩潰恢複能力的事務安全(ACID相容)能力,并要求實作并發控 制,InnoDB是個很好的選擇。如果資料表主要用來插入和查詢記錄,則MyISAM引擎能提供較 高的處理效率;如果隻是臨時存放資料,資料量不大,并且不需要較高的資料安全性,可以選擇将資料儲存在記憶體中的Memory引擎,MySQL中使用該引擎作為臨時表,存放查詢的中間結果。如果隻有INSERT和SELECT操作,可以選擇Archive引擎,Archive存儲引擎支援高并發的插 入操作,但是本身并不是事務安全的。Archive存儲引擎非常适合存儲歸檔資料,如記錄日志信 息可以使用Archive引擎。
2、使用哪一種引擎要根據需要靈活選擇,一個資料庫中多個表可以使用不同引擎以滿足各種性能和實際需求。
3、使用合适的存儲引擎,将會提高整個資料庫的性能。
4.如何檢視預設存儲引擎?
使用SHOW ENGINES語句檢視系統中所有的存儲引擎,其中包括預設的存儲引擎。可以看出來目前資料庫系統中有五種存儲引擎,預設是MyISAM。還可以使用一種直接的方法檢視預設存儲引擎。執行結果直接顯示了目前預設的存儲引擎為MyISAM。
5.表删除操作須謹慎。
表删除操作将把表的定義和表中的資料一起删除,并且MySQL在執行删除操作時,不會有 任何的确認資訊提示,是以執行删除操時,應當慎重。在删除表前,最好對表中的資料進行備份, 這樣當操作失誤時,可以對資料進行恢複,以免造成無法挽回的後果。同樣的,在使用ALTER TABLE進行表的基本修改操作時,在執行操作過程之前,也應該 確定對資料進行完整的備份,因為資料庫的改變是無法撤銷的,如果添加了一個不需要的字段, 可以将其删除;相同的,如果删除了一個需要的列,該列下面的所有資料都将會丢失。
6.每個表中都要有一個主鍵嗎?
并不是每一個表中都需要主鍵,一般的,如果多個表之間進行連接配接操作時,需要用到主鍵。 是以并不需要為每個表建立主鍵,而且有些情況最好不使用主鍵。
7.每個表都可以任意選擇存儲引擎嗎?
外鍵限制(FOREIGN KEY)不能跨引擎使用。MySQL支援多種存儲引擎,每一個表都可 以指定一個不同的存儲引擎,但是要注意:外鍵限制是用來保證資料的參照完整性,如果表之間 需要關聯外鍵,卻指定了不同的存儲引擎,這些表之間是不能建立外鍵限制的。是以說,存儲引 擎的選擇也不完全是随意的。
8.帶AUTO_INCREMENT限制的字段值是從1開始的嗎?
預設的,在MySQL中,AUTO_INCREMENT的初始值是1,每新增一條記錄,字段值自動加1。設定自增屬性(AUTO_INCREMENT)的時候,還可以指定第一條插入記錄的自增字段的 值,這樣新插入的記錄的自增字段值從初始值開始遞增,如在tb_emp8中插入第一條記錄,同時 指定id值為5,則以後插入的記錄的id值就會從6開始往上增加。添加唯一性的主鍵限制時, 往往需要設定字段自動增加屬性。
9.帶AUTO_INCREMENT限制的字段值是從1開始的嗎?
TIMESTAMP與DATETIME除了存儲位元組和支援的範圍不同外,還有一個最大的差別就是: DATETIME在存儲日期資料時,按實際輸入的格式存儲,即輸入什麼就存儲什麼,與時區無關; 而TIMESTAMP值的存儲是以UTC(世界标準時間)格式儲存的,存儲時對目前時區進行轉換, 檢索時再轉換回目前時區。即查詢時,根據目前時區的不同,顯示的時間值是不同的。
10.選擇資料類型的方法和技巧是什麼?
MySQL提供了大量的資料類型,為了優化存儲,提高資料庫性能,在任何情況下均應使用 最精确的類型。即在所有可以表示該列值的類型中,該類型使用的存儲最少。
1.整數和浮點數
如果不需要小數部分,則使用整數來儲存資料;如果需要表示小數部分,則使用浮點數類 型。對于浮點資料列,存入的數值會對該列定義的小數位進行四舍五入。例如如果列的值的範 圍為1〜99999,若使用整數,則MEDIUMINT UNSIGNED是最好的類型;若需要存儲小數,則 使用FLOAT類型。浮點類型包括FLOAT和DOUBLE類型。DOUBLE類型精度比FLOAT類型高,是以,如要求存儲精度較高時,應選擇DOUBLE類型。
2.浮點數和定點數
浮點數FLOAT,DOUBLE相對于定點數DECIMAL的優勢是:在長度一定的情況下,浮點 數能表示更大的資料範圍。但是由于浮點數容易産生誤差,是以對精确度要求比較高時,建議使 用DECIMAL來存儲。DECIMAL在MySQL中是以字元串存儲的,用于定義貨币等對精确度要 求較高的資料。在資料遷移中,float(M,D)是非标準SQL定義,資料庫遷移可能會出現問題,最 好不要這樣使用。另外兩個浮點數進行減法和比較運算時也容易出問題,是以在進行計算的時候, 一定要小心。如果進行數值比較,最好使用DECIMAL類型。
3.日期與時間類型
MySQL對于不同種類的日期和時間有很多的資料類型,比如YEAR和TIME。如果隻需要 記錄年份,則使用YEAR類型即可;如果隻記錄時間,隻須使用TIME類型。如果同時需要記錄日期和時間,則可以使用TIMESTAMP或者DATETIME類型。由于 TIMESTAMP列的取值範圍小于DATETIME的取值範圍,是以存儲範圍較大的日期最好使用 DATETIME。TIMESTAMP也有一個DATETIME不具備的屬性。預設的情況下,當插入一條記錄但并沒 有指定TIMESTAMP這個列值時,MySQL會把TIMESTAMP列設為目前的時間。是以當需要 插入記錄同時插入目前時間時,使用TIMESTAMP是友善的,另外TIMESTAMP在空間上比 DATETIME更有效。
4.CHAR與VARCHAR之間的特點與選擇
CHAR和VARCHAR的差別:
CHAR是固定長度字元,VARCHAR是可變長度字元;CHAR會自動删除插入資料的尾部 空格,VARCHAR不會删除尾部空格。
CHAR是固定長度,是以它的處理速度比VARCHAR的速度要快,但是它的缺點就是浪費 存儲空間。是以對存儲不大,但在速度上有要求的可以使用CHAR類型,反之可以使用 VARCHAR類型來實作。
存儲引擎對于選擇CHAR和VARCHAR的影響:
對于MyISAM存儲引擎:最好使用固定長度的資料列代替可變長度的資料列。這樣可以使 整個表靜态化,進而使資料檢索更快,用空間換時間。
對于InnoDB存儲引擎:使用可變長度的資料列,因為InnoDB資料表的存儲格式不分固定 長度和可變長度,是以使用CHAR不一定比使用VARCHAR更好,但由于VARCHAR是按照 實際的長度存儲,比較節省空間,是以對磁盤I/O和資料存儲總量比較好。
5.ENUM 和 SET
ENUM隻能取單值,它的資料清單是一個枚舉集合。它的合法取值清單最多允許有65 535 個成員。是以,在需要從多個值中選取一個時,可以使用ENUM。比如:性别字段适合定義為 ENUM類型,每次隻能從’男’或’女’中取一個值。SET可取多值。它的合法取值清單最多允許有64個成員。空字元串也是一個合法的SET值。 在需要取多個值的時候,适合使用SET類型,比如:要存儲一個人興趣愛好,最好使用SET類型。ENUM和SET的值是以字元串形式出現的,但在内部,MySQL以數值的形式存儲它們。
6.BLOB 和 TEXT
BLOB是二進制字元串,TEXT是非二進制字元串,兩者均可存放大容量的資訊。BLOB主 要存儲圖檔、音頻資訊等,而TEXT隻能存儲純文字檔案。應厘清兩者的用途。
11.MySQL中如何使用特殊字元?
諸如單引号(’),雙引号("),反斜線()等符号,這些符号在MySQL中不能直接輸入 使用,否則會産生意料之外的結果。在MySQL中,這些特殊字元稱為轉義字元,在輸入時需要 以反斜線符号(’\’)開頭,是以在使用單引号和雙引号時應分别輸入(\’)或者(\"),輸入反 斜線時應該輸入(\),其他特殊字元還有回車符(\r),換行符(\n),制表符(\tab),倒退 符(\b)等。在向資料庫中插入這些特殊字元時,一定要進行轉義處理。
12.MySQL中可以存儲檔案嗎?
MySQL中的BLOB和TEXT字段類型可以存儲資料量較大的檔案,可以使用這些資料類型 存儲圖像、聲音或者是大容量的文本内容,例如網頁或者文檔。雖然使用BLOB或者TEXT可 以存儲大容量的資料,但是對這些字段的處理會降低資料庫的性能。如果并非必要,可以選擇隻 儲存檔案的路徑。
13.MySQL中如何執行區分大小寫的字元串比較?
在Windows平台下,MySQL是不區分大小的,是以字元串比較函數也不區分大小寫。如果 想執行區分大小寫的比較,可以在字元串前面添加BINARY關鍵字。例如預設情況下,’a’=‘A’ 傳回結果為1,如果使用BINARY關鍵字,BINARY’a’=‘A’結果為0,在區分大小寫的情況下,’a’ 與’A’并不相同。
14.如何從日期時間值中擷取年、月、日等部分日期或時間值?
MySQL中,日期時間值以字元串形式存儲在資料表中,是以可以使用字元串函數分别截取日期時間值的不同部分,例如某個名稱為dt的字段有值“2010-10-01 12:00:30”,如果隻需要獲 得年值,可以輸入LEFT(dt, 4),這樣就獲得了字元串左邊開始長度為4的子字元串,即YEAR 部分的值;如果要擷取月份值,可以輸入MID(dt,6,2),字元串第6個字元開始,長度為2的子 字元串正好為dt中的月份值。同理,讀者可以根據其他日期和時間的位置,計算并擷取相應的值。
15.如何改變預設的字元集?
CONVERT()函數改變指定字元串的預設字元集,在開始的章節中,向讀者介紹使用GUI圖形化安裝配置工具進行MySQL的安裝和配置,其中的一個步驟是可以選擇MySQL的預設字元集。但是,如果隻改變字元集,沒有必要把配置過程重新執行一遍,在這裡,一個簡單的方式是 修改配置檔案。在Windows中,MySQL配置檔案名稱為my.ini,該檔案在MySQL的安裝目錄下面。修改配置檔案中的default-character-set和character-set-server參數值,将其改為想要的字 符集名稱,如gbk、gb2312、latinl等,修改完之後重新啟動MySQL服務,即可生效。讀者可以在修改字元集時使用SHOW VARIABLES LIKE ’character_set_°%’;指令檢視目前字元集,以進行對比。
16.DISTINCT可以應用于所有的列嗎?
查詢結果中,如果需要對列進行降序排序,可以使用DESC,這個關鍵字隻能對其前面的列 進行降序排列。例如,要對多列都進行降序排序,必須要在每一列的列名後面加DESC關鍵字。 而DISTINCT不同,DISTINCT不能部分使用。換句話說,DISTINCT關鍵字應用于所有列而不 僅是它後面的第一個指定列。例如,查詢3個字段s_id,f_name,f_price,如果不同記錄的這3個字段的組合值都不同,則所有記錄都會被查詢出來。
17.ORDER BY可以和LIMIT混合使用嗎?
在使用ORDER BY子句時,應保證其位于FROM子句之後,如果使用LIMIT,則必須位 于ORDER BY之後,如果子句順序不正确,MySQL将産生錯誤消息。
18.什麼時候使用引号?
在查詢的時候,會看到在WHERE子句中使用條件,有的值加上了單引号,而有的值未加。 單引号用來限定字元串,如果将值與字元串類型列進行比較,則需要限定引号;而用來與數值進 行比較則不需要用引号。
19.在WHERE子句中必須使用圓括号嗎?
任何時候使用具有AND和OR操作符的WHERE子句,都應該使用圓括号明确操作順序。 如果條件較多,即使能确定計算次序,預設的計算次序也可能會使SQL語句不易了解,是以使 用括号明确操作符的次序,是一個好的習慣。
20.更新或者删除表時必須指定WHERE子句嗎?
在前面章節中可以看到,所有的UPDATE和DELETE語句全都在WHERE子句中指定了條 件。如果省略WHERE子句,則UPDATE或DELETE将被應用到表中所有的行。是以,除非 确實打算更新或者删除所有記錄,否則要注意使用不帶WHERE子句的UPDATE或DELETE 語句。建議在對表進行更新和删除操作之前,使用SELECT語句确認需要删除的記錄,以免造 成無法挽回的結果。
21.索引對資料庫性能如此重要,應該如何使用它?
為資料庫選擇正确的索引是一項複雜的任務。如果索引列較少,則需要的磁盤空間和維護開銷 都較少。如果在一個大表上建立了多種組合索引,索引檔案也會膨脹很快。而另一方面,索引較多 可覆寫更多的查詢。可能需要試驗若幹不同的設計,才能找到最有效的索引。可以添加、修改和删 除索引而不影響資料庫架構或應用程式設計。是以,應嘗試多個不同的索引進而建立最優的索引。
22.盡量使用短索引。
對字元串類型的字段進行索引,如果可能應該指定一個字首長度。例如,如果有一個 CHAR(255)的列,如果在前10個或30個字元内,多數值是惟一的,則不需要對整個列進行索引。 短索引不僅可以提高查詢速度而且可以節省磁盤空間、減少I/O操作。
23. MySQL存儲過程和函數有什麼差別?
在本質上它們都是存儲程式。函數隻能通過return語句傳回單個值或者表對象;而存儲過程 不允許執行return,但是可以通過out參數傳回多個值。函數限制比較多,不能用臨時表,隻能用表變量,還有一些函數都不可用等等;而存儲過程的限制相對就比較少。函數可以嵌入在SQL 語句中使用,可以在SELECT語句中作為查詢語句的一個部分調用;而存儲過程一般是作為一個獨立的部分來執行。
24.存儲過程中的代碼可以改變嗎?
目前,MySQL還不提供對已存在的存儲過程代碼的修改,如果必須要修改存儲過程,必須使用DROP語句删除之後,再重新編寫代碼,或者建立一個新的存儲過程。
25.存儲過程中可以調用其他存儲過程嗎?
存儲過程包含使用者定義的SQL語句集合,可以使用CALL語句調用存儲過程,當然在存儲 過程中也可以使用CALL語句調用其他存儲過程,但是不能使用DROP語句删除其他存儲過程。
26.存儲過程的參數不要與資料表中的字段名相同。
在定義存儲過程參數清單時,應注意把參數名與資料庫表中的字段名差別開來,否則将出 現無法預期的結果。
27.存儲過程的參數可以使用中文嗎?
一般情況下,可能會出現存儲過程中傳入中文參數的情況,例如某個存儲過程根據使用者的 名字查找該使用者的資訊,傳入的參數值可能是中文。這時需要在定義存儲過程的時候,在後面加 上character set gbk,不然調用存儲過程使用中文參數會出錯,比如定義userInfo存儲過程,代碼 如下:
1.兩者的差別:28.MySQL中視圖和表的差別以及聯系是什麼?
(1)視圖是已經編譯好的SQL語句,是基于SQL語句的結果集的可視化的表,而表不是。
(2)視圖沒有實際的實體記錄,而基本表有。
(3)表是内容,視圖是視窗。
(4)表占用實體空間而視圖不占用實體空間,視圖隻是邏輯概念的存在,表可以及時對它 進行修改,但視圖隻能用建立的語句來修改。
(5)視圖是檢視資料表的一種方法,可以查詢資料表中某些字段構成的資料,隻是一些SQL 語句的集合。從安全的角度來說,視圖可以防止使用者接觸資料表,因而使用者不知道表結構。
(6)表屬于全局模式中的表,是實表;視圖屬于局部模式的表,是虛表。
(7)視圖的建立和删除隻影響視圖本身,不影響對應的基本表。
2.兩者的聯系:
視圖(view)是在基本表之上建立的表,它的結構(即所定義的列)和内容(即所有記錄) 都來自基本表,它依據基本表存在而存在。一個視圖可以對應一個基本表,也
可以對應多個基本 表。視圖是基本表的抽象和在邏輯意義上建立的新關系。
29.使用觸發器時須特别注意。
在使用觸發器的時候需要注意,對于相同的表,相同的事件隻能建立一個觸發器,比如對 表account建立了一個BEFORE INSERT觸發器,那麼如果對表account再次建立一個BEFORE INSERT觸發器,MySQL将會報錯,此時,隻可以在表account上建立AFTER INSERT或者 BEFORE UPDATE類型的觸發器。靈活的運用觸發器将為操作省去很多麻煩。
30.及時删除不再需要的觸發器。
觸發器定義之後,每次執行觸發事件,都會激活觸發器并執行觸發器中的語句。如果需求 發生變化,而觸發器沒有進行相應的改變或者删除,則觸發器仍然會執行舊的語句,進而會影響 新的資料的完整性。是以,要将不再使用的觸發器及時删除。
31.應該使用哪種方法建立使用者?
建立使用者有幾種方法:GRANT語句、CREATE USER語句和直接操作user表。一般情況, 最好使用GRANT或者CREATE USER語句,而不要直接将使用者資訊插入user表,因為user表中存儲了全局級别的權限以及其他的賬戶資訊,如果意外破壞了 user表中的記錄,則可能會對 MySQL伺服器造成很大影響。
32.mysqldump備份的檔案隻能在MySQL中使用嗎?
mysqldump備份的文本檔案實際是資料庫的一個副本,使用該檔案不僅可以在MySQL中恢 複資料庫,而且通過對該檔案的簡單修改,可以使用該檔案在SQL Server或者Sybase等其他數 據庫中恢複資料庫。這在某種程度上實作了資料庫之間的遷移。
33.如何選擇備份工具?
直接複制資料檔案是最為直接、快速的備份方法,但缺點是基本上不能實作增量備份。備 份時必須確定沒有使用這些表。如果在複制一個表的同時伺服器正在修改它,則複制無效。備份 檔案時,最好關閉伺服器,然後重新啟動伺服器。為了保證資料的一緻性,需要在備份檔案前, 執行以下SQL語句:
目錄下即可。mysqlhotcopy 是一個 PERL 程式,它使用 LOCK TABLES、FLUSH TABLES 和 cp 或 scp來快速備份資料庫。它是備份資料庫或單個表的最快的途徑,但它隻能運作在資料庫檔案所在的 機器上,并且mysqlhotcopy隻能用于備份MyISAM表。mysqlhotcopy适合于小型資料庫的備份, 資料量不大,可以使用mysqlhotcopy程式每天進行一次完全備份。mysqldump将資料表導成SQL腳本檔案,在不同的MySQL版本之間更新時相對比較合适, 這也是最常用的備份方法。mysqldump比直接複制要慢些。也就是把記憶體中的資料都重新整理到磁盤中,同時鎖定資料表,以保證複制過程中不會有新的 資料寫入。這種方法備份出來的資料恢複也很簡單,直接複制回原來的資料庫
34.平時應該打開哪些日志?
日志既會影響MySQL的性能,又會占用大量磁盤空間。是以,如果不必要,應盡可能少地 開啟日志。根據不同的使用環境,可以考慮開啟不同的日志。例如,在開發環境中優化查詢效率 低的語句,可以開啟慢查詢日志;如果需要記錄使用者的所有查詢操作,可以開啟通用查詢日志; 如果需要記錄資料的變更,可以開啟二進制日志;錯誤日志是預設開啟的。
35.如何使用二進制日志?
二進制日志主要用來記錄資料變更。如果需要記錄資料庫的變化,可以開啟二進制日志。 基于二進制日志的特性,不僅可以用來進行資料恢複,還可用于資料複制。在資料庫定期備份的 情況下,如果出現資料丢失,可以先用備份恢複大部分資料,然後使用二進制日志恢複最近備份 後變更的資料。在雙機熱備情況下,可以使用MySQL的二進制日志記錄資料的變更,然後将變 更部分複制到備份伺服器上。
36.如何使用慢查詢日志?
慢查詢日志主要用來記錄查詢時間較長的日志。在開發環境下,可以開啟慢查詢日志來記 錄查詢時間較長的查詢語句,然後對這些語句進行優化。通過配long_query_time的值,可以靈活地掌握不同程度的慢查詢語句。
37.是不是索引建立得越多越好?
合理的索引可以提高查詢的速度,但不是索引越多越好。在執行插入語句的時候,MySQL 要為新插入的記錄建立索引。是以過多的索引會導緻插入操作變慢。原則上是隻有查詢用的字段 才建立索引。
38.如何使用查詢緩沖區?
查詢緩沖區可以提高查詢的速度,但是這種方式隻适合查詢語句比較多、更新語句比較少 的情況。預設情況下查詢緩沖區的大小為〇,也就是不可用。可以修改queiy_cache_size以調整 查詢緩沖區大小;修改query_cache_type以調整查詢緩沖區的類型。在my.ini中修改 query_cache_size 和 query_cache_type 的值如下所示:
表示開啟查詢緩沖區。隻有在查詢語句中包含SQL_NO_CACHE關鍵字 時,才不會使用查詢緩沖區。可以使用FLUSH QUERY CACHE語句來重新整理緩沖區,清理查詢緩 沖區中的碎片。
歡迎工作一到五年的Java工程師朋友們加入Java架構開發:860113481
群内提供免費的Java架構學習資料(裡面有高可用、高并發、高性能及分布式、Jvm性能調優、Spring源碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)合理利用自己每一分每一秒的時間來學習提升自己,不要再用"沒有時間“來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個交代!