MySQL小提示

  1. 使用配置嚮導時,可以將MySQL註冊爲系統服務,MySQL會隨Windows自動啓動。這樣免除了每次手動輸入啓動命令的麻煩,如果不想安裝服務,可以取消【Install As Windows Service】選項旁邊的複選按鈕。如果讀者不需要經常使用MySQL,可以在配置嚮導中不選擇【Launch the MySQL Server automatically】選項,根據需要使用net命令啓動或者關閉MysQL服務,這樣也減少了系統資源的浪費。
  2. 安裝過程失敗,多是由於重新安裝MySQL的緣故,因爲MySQL在刪除的時候,不能自動刪除相關的信息。解決方法,把以前安裝的目錄刪除。刪除在C盤的program file文件夾裏面mysql的安裝目錄文件夾;同時刪除MySQL的DATA目錄,該目錄一般爲隱藏文件,其位置一般在"c:\Documents and Settings\All Users\Application Data\MySQL"目錄下,刪除後重新安裝即可。
  3. SHOW ENGINES查看系統中所有的存儲引擎                  SHOW VARIABLES查看默認存儲引擎,如:mysql>SHOW VARIABLES LIKE 'storage_engine';該執行結果直接顯示了當前默認的存儲引擎。MySQL不同版本中的默認存儲引擎不同,MySQL允許修改默認存儲引擎,方法是修改配置文件。在Windows平臺下,設置數據庫默認存儲引擎需要修改默認文件my.ini。例如,將MySQL5.5的默認存儲引擎修改爲MyISAM。首先打開my.ini,將[mysqld]字段下面的default-storage-engine參數後面的值,由“InnoDB”改爲“MyISAM”,保存文件,重新啓動MySQL即可。
  4. 表刪除操作將把表的定義和表中的數據一起刪除,並且MySQL在執行刪除操作時,不會有任何的確認信息提示,因此執行刪除操作時,應該慎重。在刪除表前,最好對錶中的數據進行備份,這樣當操作失誤時,可以對數據進行恢復,以免造成無法挽回的結果。同樣的,在使用ALTER TABLE 進行表的基本修改操作時,在執行操作過程前,也應該確保對數據進行完整的備份,因爲數據庫的改變是無法撤銷的,如果添加了一個不需要的字段,可以將其刪除;相同的,如果刪除一個需要的列,該列下面的實驗數據將失去。
  5. 並不是每一個表中都需要主鍵,一般的,如果多個表之間進行連接操作時,需要用到主鍵。因此,並不需要爲每一個表建立主鍵,而且有些情況最好不使用主鍵。
  6. 外鍵約束(FOREIGN KEY)不能誇引擎使用。MySQL支持多種存儲引擎,每一個表都可以指定一個不同的存儲引擎,但是要注意:外鍵約束是用來保證數據的參照完整性,如果表之間需要關聯外鍵,卻指定不同的存儲引擎,這些表之間是不能創建外鍵約束的。所以說,存儲引擎的選擇也不完全是隨意的。
  7. 默認的,在MySQL中,AUTO_INCREMENT的初始值是1,每新增一條記錄,字段值自動加1.設置自增屬性(AUTO_INCREMENT)的時候,還可以指定每一條插入記錄的自增字段的值,這樣新插入的記錄的自增字段值從初始值開始遞增,如在tb_emp8中插入第一條記錄,同時指定id值爲5,則以後插入的記錄的id值就會從6開始往上增加。添加唯一性的主鍵約束時,往往需要設置字段自動增加屬性。
  8. 諸如單引號('),雙引號("),反斜線(\)等符號,這些符號在MySQL中不能直接輸入使用,否則會產生意料之外的結果。在MySQL中,這些特殊字符稱爲轉義字符,在輸入時需要以反斜線(‘\’)開頭,所以在使用單引號和雙引號時應分別輸入(\')或者(\"),輸入反斜線時應該輸入(\\),其他特殊字符還有回車符(\r),換行符(\n),製表符(\tab),退格符(\b)等。在向數據庫中插入這些特殊字符時,一定要進行轉義處理。
  9. MySQL中的BLOB和TEXT字段類型可以存儲數據量較大的文件,可以使用這些數據類型存儲圖像,聲音或者是大容量的文本內容,例如網頁或者文檔。雖然使用BLOB或者TEXT可以存儲大容量的數據,但是對這些字段的處理會降低數據庫的性能。如果並非必要,可以選擇只存儲文件的路徑。
  10. 在Windows平臺下,MySQL是不區分大小的,因此字符串比較函數也不區分大小寫。如果想執行區分大小寫的比較,可以在字符串前面添加BINARY關鍵字,例如默認情況下,‘a’=‘A’返回結果爲1,如果使用BINARY關鍵字,BINARY‘a'=’A‘結果爲0,在區分大小寫的情況下,‘a'=’A‘並不同等。
  11. MySQL中,日期時間值以字符串形式存儲在數據表中,因此可以使用字符串函數分別截取日期時間值的不同部分,例如某個名稱爲dt的字段值“2010-10-01 12:00:30”,如果只需要獲得年值,可以輸入LEFT(dt,4),這樣就獲得了字符串左邊開始長度爲4的字符串,即YEAR部分的值;如果需要獲得月份值,可以輸入MID(dt,6,2),字符串第6個字符開始,長度爲2的子字符串正好爲dt中的月份值。同理,讀者可以根據其他日期和時間的位置,計算並獲得相應的值。
  12. CONVERT()函數改變指定字符串的默認字符集,在開始的章節中,向讀者介紹使用GUI圖形化安裝配置工具進行MySQL的安裝和配置,其中的一個步驟是可以選擇MySQL的默認字符集。但是,如果只改變字符集,沒有必要把配置過程重新執行一遍,在這裏,一個簡單的方式是修改配置文件。在Windows中,MySQL配置文件名稱爲my.ini,該文件在MySQL的安裝目錄下面。修改配置文件中的default-character-set和character-set-server參數值,將其改爲想要的字符集名稱,如gbk,gb2312,latin1等,修改完之後重新啓動MySQL服務,即可生效。讀者可以在修改字符集時使用SHOW VARIABLES LIKE 'character_set_%';命令查看當前字符集,以進行對比。
  13. 查詢結果中,如果需要對列進行降序排序,可以使用DESC,這個關鍵字只能對前面的列進行降序排列。例如,要對多列都進行降序排序,必須要在每一列的列名後面加DESC關鍵字。而DISTINCT不同,DISTINCT不能部分使用。換句話說,DISTINCT關鍵字應用於所有列而不僅是它後面的第一個指定列。例如,查詢3個字段s_id,f_name,f_price,如果不同記錄的這3個字段的組合值都不同,則所有記錄都會被查詢出來。
  14. 在使用ORDER BY字句時,應保證其位於FROM字句之後,如果使用LIMIT,則必須位於ORDER BY之後,如果字句順序不正確,MySQL將產生錯誤信息。
  15. 在查詢的時候,會看到在WHERE字句中使用條件,有的值加上了單引號,而有的值未加。單引號用來限定字符串,如果將值與字符串類型列進行比較,則需要限定引號;而用來與數值進行比較則不需要用引號。
  16. 如何時候使用具有AND和OR操作符的WHERE字句,都應該使用圓括號明確操作順序。如果條件較多,即使能確定計算次序,默認的計算次序也可能會使SQL語句不易理解,因此使用括號明確操作符的次序,是一個好的習慣。
  17. MySQL中存儲字符串數據時,可能會不小心把兩端帶有空格的字符串保存到記錄中,而在查看錶中記錄時,MySQL不能明確的顯示空格,數據庫操作者不能直觀的確定字符串兩端是否有空格。例如,使用LIKE‘%e’匹配以字母e結尾的水果的名稱,如果字母e後面多了一個空格,則LIKE語句不能將該記錄查詢出來。解決方法是使用TRIM函數,將字符串兩端的空格刪除之後再進行匹配。
  18. 不管使用哪種INSERT語法 ,都必須給出VALUES的正確數目。如果不能提供字段名,則必須給每個字段提供一個值,否則將產生一條錯誤信息。如果要在INSERT操作中省略某些字段,這些字段需要滿足一定條件:該列定義爲允許空值;或者表定義時給出默認值,如果不給出值,將使用默認值。
  19. 所有的UPDATE和DELETE語句全都在WHERE字句中指定了條件。如果省略WHERE字句,則UPDATE或DELETE將被應用到表中所有的行。因此,除非確實打算更新或者刪除所有記錄,否則要注意使用不帶WHERE字句的UPDATE或DELETE語句。建議在對錶進行更新和刪除操作之前,使用SELECT語句確認需要刪除的記錄,以免造成無法挽回的結果。
  20. 爲數據庫選擇正確的索引是一項複雜的任務。如果索引列較少,則需要的磁盤空間和維護開銷都較少。如果在一個大表上創建了多組索引,索引文件也會膨脹很快。而另一方面,索引較多可覆蓋更多的查詢。可能需要試驗若干不同的設計,才能找到最有效的索引。可以添加,修改和刪除索引而不影響數據庫架構或應用程序設計。因此,應嘗試多個不同的索引從而建立最優的索引。
  21. 對字符串類型的字段進行索引,如果可能應該指定一個前綴長度。例如,如果有一個CHAR(255)的列,如果在前10個或30個字符內,多數值是唯一的,則不需要對整個列進行索引。短索引不僅可以提高查詢速度而且可以節省磁盤空間,減少I/O操作。
  22. MySQL存儲過程和函數在本質上都是存儲程序。函數只能通過return語句返回單個值或者對象;而存儲過程不允許執行return,但是可以通過out參數返回多個值。函數限制比較多,不能用臨時表,只能用表變量,還有一些函數都不可用等等;而存儲過程的限制相對就比較少。函數可以嵌入在SQL語句中使用,可以在SELECT語句中作爲查詢語句的一個部分調用;而存儲過程一般是作爲一個獨立的部分來執行。
  23. 目前,MySQL還不提供對已存在的存儲過程代碼的修改,如果必須修改存儲過程,必須使用DROP語句刪除之後,再重新編寫代碼,或者創建一個新的存儲過程。
  24. 存儲過程包含用戶的SQL語句集合,可以使用CALL語句調用存儲過程,當然在存儲過程中也可以使用CALL語句調用其他存儲過程,但是不能使用DROP語句刪除其他存儲過程。
  25. 在定義存儲過程參數列表時,應該注意把參數名與數據庫表中的字段名區別開來,否則將出現無法預期的結果。
  26. 一般情況下,可能會出現存儲過程中傳入中文參數的情況,例如某個存儲過程根據用戶的名字查找該用戶的信息,傳入的參數值可能是中文。這時需要在定義存儲才的時候,在後面加上character set gbk,不然調用存儲過程使用中文參數會出錯,比如定義userInfo存儲過程,代碼如下:        CREATE PROCEDURE useInfo(IN u_name VARCHAR(50) character set gbk,OUT u_age INT)
  27. MySQL中視圖和表的區別:1)視圖是已經編譯好的SQL語句,是基於SQL語句的結果集的可視化的表,而表不是。2)視圖沒有實際的物理記錄,而基本表有。3)表是內容,視圖是窗口。4)表佔用物理空間而視圖不佔用物理空間,視圖只是邏輯概念的存在,表可以及時對它進行修改,但是視圖只能用創建的語句來修改。5)視圖是查看數據表的一種方法,可以查詢數據表中某些字段構成的數據,只是一些SQL語句的集合。從安全的角度看,視圖可以防止用戶接觸數據表,因此用戶不知道表結構。6)表屬於全局模式中的表,是實表;視圖屬於局部模式的表,是虛表。7)視圖的建立好刪除隻影響視圖本身,不影響對應的基本表。     聯繫:視圖是在基本表之上建立的表,它的結構(即所定義的列)和內容(即所有記錄)都來自基本表,它依據基本表存在而存在。一個視圖可以對應一個基本表,也可以對應多個基本表。視圖是基本表的抽象和在邏輯意義上建立的新關係。
  28. 在使用觸發器的時候需要注意,對於相同的表,相同的事件只能創建一個觸發器,比如對錶account創建了一個BEFORE INSERT觸發器,那麼如果對錶account再次創建一個BEFORE INSERT觸發器,MySQL將會報錯,此時,只可以在表account上創建AFTER INSERT或者BEFORE UPDATE類型的觸發器。
  29. 觸發器定義之後,每次執行觸發事件,都會激活觸發器並執行觸發器中的語句。如果需求發生變化,而觸發器沒有進行相應的改變或刪除,則觸發器仍然會執行舊的語句,從而會影響新的數據的完整性。因此,要將不再使用的觸發器及時刪除。
  30. 已經將一個賬戶的信息從數據庫中完全刪除,爲什麼用戶還能登錄數據庫?   出現這種情況的原因可能有多種,最有可能是在user數據表中存在匿名賬戶。在user表中匿名賬戶的User字段值爲空字符串,這會允許任何人連接到數據庫,檢測是否存在匿名登錄用戶的方法是,輸入以下語句:           SELECT *FROM user WHERE User='';如果有記錄返回,說明存在匿名賬戶,需要刪除該記錄,以保證數據庫的安全,刪除語句爲: DELETE FROM user WHERE user='';
  31. 創建用戶的幾種方法:GRANT語句,CREATE USER語句和直接操作user表。一般情況,最好使用GRANT或者CREATE USER語句,而不要直接將用戶信息插入user表,因爲user表中存儲了全局級別的權限以及其他的賬戶信息,如果意外破壞了user表中的記錄,則可能對MySQL服務器造成很大的影響。
  32. mysqldump備份的文本文件實際是數據庫的一個副本,使用該文件不僅可以在MySQL中恢復數據庫,而且通過對該文件的簡單修改,可以使用該文件在SQL Server或者Sybase等其他數據庫中恢復數據庫。這在某種程度上實現了數據庫之間的遷移。
  33. 直接複製數據文件是最爲直接,快速的備份方法,但缺點是基本是不能實現增量備份。備份時必須確保沒有使用這些表。如果在複製一個表的同時服務器正在修改它,則複製無效。備份文件時,最好關閉服務器,然後重啓服務器。爲了保證數據的一致性,需要在備份文件前,執行以下語句:                   FLUSH TABLES WITH READ LOCK;也就是把內存中的數據都刷新到磁盤中,同時鎖定數據表,以保證複製過程中不會有新的數據寫入。這種方法備份出來的數據恢復也很簡單,直接複製回原來的數據庫目錄即可。                                        mysqlhotcopy是一個PERL程序,它使用LOCK TABLES,FLUSH TABLES 和cp或scp來快速備份數據庫。它是備份數據庫或單個表的最快的途徑,但它只能運行在數據庫文件所在的機器上,並且mysqlhotcopy只能用於備份MyISAM表。mysqlhotcopy適合於小型數據庫的備份,數據量不大,可以使用mysqlhotcopy程序每天進行一次完全備份。                             mysqldump將數據表導成SQL腳本文件,在不同的MySQL版本之間升級時相對比較合適,這也是最常用的備份方法。mysqldump比直接複製慢些。
  34. 使用mysqldump備份整個數據庫成功,把表和數據庫都刪除了,但使用備份文件卻不能恢復數據庫?  出現這種情況,是因爲備份的時候沒有指定--databases參數。默認情況下,如果只指定數據庫名稱,mysqldump備份的是數據庫中所有的表,而不包括數據庫的創建語句,例如:         mysqldump -u root -p booksDB>c:\backup\booksDB_20110101.sql              該語句只備份了booksDB數據庫下所有的表,讀者打開該文件,可以看到文件中不包含創建booksDB數據庫的CREATE DATABASE語句,因此如果把booksDB也刪除了,使用該sql文件不能還原以前的表,還原時會出現ERROR 1046 (3D000):No database selected的錯誤信息。必須在MySQL命令下創建booksDB數據庫,並使用use語句選擇booksDB之後纔可以還原。而下面的語句,數據庫刪除之後,可以正常還原備份時的狀態。                                                          mysqldump -u root -p --databass booksDB>c:\backup\booksDB_20110101.sql   該語句不僅備份了所有數據庫下的表結構,而且包括創建數據庫的語句。
  35. 日誌即會影響MySQL的性能,又會佔用大量磁盤空間。因此,如果不必要,應儘量可能少地開啓日誌。根據不同的使用環境,可以考慮開啓不同的日誌。例如,在開發環境中優化查詢效率低的語句,可以開啓慢查詢日誌;;如果需要記錄用戶的所有查詢操作,可以開啓通用查詢日誌;如果需要記錄數據的變更,可以開啓二進制日誌;錯誤日誌是默認開啓的。
  36. 二進制日誌主要用來記錄數據變更。如果需要記錄數據庫的變化,可以開啓二進制日誌。基於二進制日誌的特性,不僅可以用來進行數據恢復,還可以用於數據複製。在數據庫定期備份的情況下,如果出現數據丟失,可以先用備份恢復大部分數據,然後使用二進制日誌恢復最近備份後變更的數據。在雙機熱備情況下,可以使用MySQL的二進制日誌記錄數據的變更,然後將變更部分複製到備份服務器上。
  37. 慢查詢日誌主要用來記錄查詢時間較長的日誌。在開發環境下,可以開啓慢查詢日誌來記錄查詢時間較長的查詢語句,然後對這些語句進行優化。通過配置long_query_time的值,可以靈活地掌握不同程度的慢查詢語句。
  38. 合理的索引可以提高查詢的速度,但不是索引越多越好。在執行插入語句的時候,MySQL要爲新插入的記錄建立索引。所以過多的索引會導致插入操作變慢。原則上是隻有查詢的字段才建立索引。
  39. 在一些情況下,查詢語句中使用了帶有索引的字段。但索引並沒有起作用。例如,在WHERE條件的LIKE關鍵字匹配是字符串以 “開頭,這種情況下索引不會起作用。又如,WHERE條件中使用OR關鍵字連接查詢條件,如果有1個字段沒有使用索引,那麼其他的索引也不會起作用。如果使用多列索引,但沒有使用多列索引中的第1個字段,那麼多列索引也不會起作用。
  40. 查詢緩衝區可以提高查詢的速度,但是這種方法只適合查詢語句比較多,更新語句比較少的情況。默認情況下查詢緩衝區的大小爲0,也就是不可用。可以修改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語句來刷新緩衝區,清理查詢緩衝區中的碎片。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章