快速學習MySQL數據庫!掌握這38點夠用了

原文:https://www.cnblogs.com/Survi...html

不管是運維、開發、測試,仍是架構師,數據庫技術是一個必備加薪神器,那麼,一直說學習數據庫、學MySQL,究竟是要學習它的哪些東西呢?此文爲你揭曉,你值得一看!看過別忘記點贊+轉發支持哦。
1.如何快速掌握MySQL?

⑴培養興趣
興趣是最好的老師,不論學習什麼知識,興趣均可以極大地提升學習效率。固然學習MySQL 5.6也不例外。
⑵夯實基礎
計算機領域的技術很是強調基礎,剛開始學習可能還認識不到這一點,隨着技術應用的深 入,只有有着紮實的基礎功底,才能在技術的道路上走得更快、更遠。對於MySQL的學習來講, SQL語句是其中最爲基礎的部分,不少操做都是經過SQL語句來實現的。因此在學習的過程當中, 讀者要多編寫SQL語句,對於同一個功能,使用不一樣的實現語句來完成,從而深入理解其不一樣之處。
(3)及時學習新知識
正確、有效地利用搜索引擎,能夠搜索到不少關於MySQL 5.6的相關知識。同時,參考別 人解決問題的思路,也能夠吸收別人的經驗,及時獲取最新的技術資料。
⑷多實踐操做
數據庫系統具備極強的操做性,須要多動手上機操做。在實際操做的過程當中才能發現問題, 並思考解決問題的方法和思路,只有這樣才能提升實戰的操做能力。mysql

2.如何選擇服務器的類型?

MySQL服務器配置窗口中各個參數的含義以下。
【Server Configuration Type】該選項用於設置服務器的類型。單擊該選項右側的向下按鈕, 便可看到包括3個選項。web

3個選項的具體含義以下。sql

  • (1) Development Machine(開發機器):該選項表明典型我的用桌面工做站。假定機器上運行 着多個桌面應用程序。將MySQL服務器配置成使用最少的系統資源。
  • (2) Server Machine (服務器):該選項表明服務器,MySQL服務器能夠同其它應用程序一塊兒 運行,例如FTP、email和web服務器。MySQL服務器配置成使用適當比例的系統資源。
  • (3) DedicatedMySQL Server Machine (專用 MySQL 服務器):該選項表明只運行MySQL服務的服務器。假定運行沒有運行其它應用程序。MySQL服務器配置成使用全部可用系統資源。做爲初學者,建議選擇【DevelopmentMachine】(開發者機器)選項,這樣佔用系統的資源 比較少。
3.如何選擇存儲引擎

不一樣存儲引擎都有各自的特色,以適應不一樣的需求,以下表所示。爲了作出選擇:數據庫

  • 一、首先需 要考慮每個存儲引擎提供了哪些不一樣的功能。若是要提供提交,回滾和崩潰恢復能力的事務安全(ACID兼容)能力,並要求實現併發控 制,InnoDB是個很好的選擇。若是數據表主要用來插入和查詢記錄,則MyISAM引擎能提供較 高的處理效率;若是隻是臨時存放數據,數據量不大,而且不須要較高的數據安全性,能夠選擇將數據保存在內存中的Memory引擎,MySQL中使用該引擎做爲臨時表,存放查詢的中間結果。若是隻有INSERT和SELECT操做,能夠選擇Archive引擎,Archive存儲引擎支持高併發的插 入操做,可是自己並非事務安全的。Archive存儲引擎很是適合存儲歸檔數據,如記錄日誌信 息可使用Archive引擎。
  • 二、使用哪種引擎要根據須要靈活選擇,一個數據庫中多個表可使用不一樣引擎以知足各類性能和實際需求。
  • 三、使用合適的存儲引擎,將會提升整個數據庫的性能。
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、gb23十二、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存儲過程,代碼 以下:

CREATE PROCEDURE useInfo(IN u_name VARCHAR(50) character set gbk, OUT u_age INT)

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語句:

CREATE PROCEDURE useInfo(IN u_name VARCHAR(50) character set gbk, OUT u_age INT)

目錄下便可。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 的值以下所示:

[mysqld]
query_cache_size= 512M 
query_cache_type= 1
query_cache_type=1

表示開啓查詢緩衝區。只有在查詢語句中包含SQL_NO_CACHE關鍵字 時,纔不會使用查詢緩衝區。可使用FLUSH QUERY CACHE語句來刷新緩衝區,清理查詢緩 衝區中的碎片。

相關文章
相關標籤/搜索