Mysql知識彙總筆記

一。關於錶鏈接

1. 錶鏈接主要包括外鏈接和內鏈接,內鏈接只是選出鏈接的兩張表中的相匹配的記錄,可是外鏈接會選出其它不匹配的記錄。內鏈接和外鏈接有不一樣的應用場景。java

2. 左鏈接是以左邊表中的記錄爲準,若是右邊表中沒有和左邊表相匹配的記錄,左邊表的記錄仍是會顯示。
3. 右鏈接是以右邊表中的記錄爲準,若是左邊表中沒有和右邊表相匹配的記錄,右邊表的記錄仍是會顯示。
4. 由2和3中能夠知道,左鏈接和右鏈接是能夠互相轉換的
 
二。關於內建函數,須要用的時候能夠查表,儘可能使用這些函數,避免本身實現
1. 字符串函數,concat等
2. 數值函數,rand函數
3. 日期和時間函數,unix_timestamp(date)和from_unixtime()
4. 流程函數,好比if,和casewhen
5. 其它經常使用函數,Ip和long轉換,md5,password函數等
 
三。關於存儲引擎,根據不一樣的應用類型選擇合適的存儲引擎
1. 經常使用的存儲引擎包括innodb和myisam,其中myisam主要用於OLAP的應用,innodb主要用於OLTP的應用。
2. myisam表文件:.frm(表定義).myd(存儲數據).myi(存儲索引)
3. myisam表支持的存儲格式:
    a. 靜態表(每條記錄都是固定長度,存儲很是迅速,容易緩存,缺點是佔用的空間比動態表多,由於存儲的時候會按照列的寬度定義來補足空格)
    b. 動態表(包含變長字段,記錄不是固定的長度,存儲佔用空間相對少,可是頻繁更新刪除會形成碎片,須要執行optimize table)
    c. 壓縮表(佔據磁盤空間很小,每一個記錄單獨壓縮)
4. innodb自動增加列必須是索引,若是是組合索引,必須是組合索引的第一列。
5. innodb支持外鍵,外鍵約束詳見:
6. innodb存儲表和索引有共享表空間和多表空間存儲的形式。及時在多表空間的存儲方式下,共享表空間仍然是必須的,innodb會把內部數據詞典和未做日誌放在這個文件之中。
7. 若是應用以讀操做和插入操做爲主,只有不多的更新和刪除操做,而且對事務的完整性,併發性要求不高,那麼就選擇myisam引擎。若是對事務的完整性要求比較高,在併發狀況下         要求數據的一致性,數據CRUD操做都有,那麼選擇innodb存儲引擎,這樣能夠有效的下降因爲刪除和更新致使的鎖定,確保事務的完整性。
 
四。關於數據類型
1. 少許字符串的時候選擇char和varchar,大量文本的時候用text或者blob,blob用來保存二進制數據。不過blob和text在刪除操做的時候會留下很大的空洞,之後填入這些空洞的記錄在插入的性能上會有影響。能夠用optimize table來整理碎片。小技巧是可使用合成索引(根據大文原本創建一個散列值)提升查詢性能,不過只能應用於精確查找。
2. 浮點數要注意精度和四捨五入的問題。在一些精度要求比較大的應用中應該使用定點數或者字符串來存儲數據。
3. 根據實際須要來選擇知足應用的最小存儲的日期類型。datetime類型記錄的年份可以比較久遠,timestamp可以和實際時區相對應。
 
五。關於字符集
1. 關於經常使用的編碼知識,詳見:
2. 在選擇數據庫字符集的時候須要根據應用的需求來的ing,是否知足應用所支持的語言的需求,是否須要處理各類各樣的蚊子,或者發佈到不一樣語言的國家和地區。若是數據庫中已經存在了數據,還須要充分考慮數據庫字符集對已有數據的兼容性。好比漢字編碼比較多,那麼能夠選擇GBK,由於GBK漢字佔用兩個字節,UTF8佔用三個字節,若是僅有少許漢字數據,那麼選擇UTF8好,由於UTF8英文字符只須要一個字節,其他的GBK或者UTF16都須要兩個字節來對西文字符進行編碼。
3. mysql保存數據的字符集和校對規則有4個級別的默認設置:服務器級別,數據庫級別,表級別和字段級。分別在不一樣的地方設置,做用也不一樣。
4. 還須要注意客戶端和服務器之間交互的字符集和校對規則,mysql提供了三個不一樣的參數來表明客戶端,鏈接和返回結果的字符集,一般狀況下,這三個字符集應該是同樣。
5. 字符集的修改步驟:
 
六。關於索引
1. 索引的列的值波動範圍越大,索引的效果越好。
2. 若是對字符串列進行索引,應該指定一個前綴長度,這樣可以節省大量的索引空間。
3. 利用最左前綴,在建立一個N列的索引時,其實是建立了mysql可利用的N個索引。多列索引能夠起幾個索引的做用,由於可利用索引中最左邊的列集來匹配,這樣的列稱爲最左前綴
4. 不要過分索引,索引會佔用磁盤空間,下降寫操做的性能,此外,mysql在生成一個執行計劃的時候須要考慮各個索引,這也會花費時間。
5. innodb記錄默認會按照主鍵或者惟一索引來保存記錄,要選擇最常訪問的列做爲主鍵,提升查詢效率。innodb的表的普通索引也都會保存主鍵的鍵值,因此主鍵要儘量選擇較短的數據類型,這樣能夠減小索引的磁盤佔用。
6. btree索引的介紹:
7. 大多數的mysql索引(primarykey,unique,index和fulltext)在btree中存儲。空間列類型的索引使用RTREE,而且memory表還支持hash索引。
 
七。關於視圖
 
八。關於存儲過程和函數
1. 存儲過程的詳細語法介紹:
2. 存儲過程和函數的優點是能夠將數據的處理放在數據庫服務器上進行,避免將大量的結果集傳輸給客戶端,減小數據的傳輸,可是數據庫服務器上進行大量的運算也會佔用服務器的CPU,形成數據庫服務器的壓力,因此要仔細斟酌。
 
九。關於觸發器
1. 觸發器是與表相關的數據庫對象,在知足定義條件時出發,而且執行觸發器中定義的語句集合。做用是能夠協助應用在數據庫端確保數據的完整性。
2. 觸發器的語法詳見:
 
十。事務和鎖
1. mysql支持對myisam的表級鎖定,對innodb的行級別鎖定。當與服務器的鏈接被關閉的時候,全部由當前線程鎖定的表都會被解鎖。
2. myisam鎖和事務詳細列子:
3. 分佈式事務:
 
十一。sql安全和sql mode
1. sql注入:程序對用戶輸入的數據沒有進行嚴格的過濾,致使非法數據庫查詢語句的執行,同理的還有xss注入。java中採用prepareStatement來防止sql注入。
2. sqlmode:經過設置sql mode,能夠完成不一樣嚴格程度的數據校驗,有效的保障數據的準確性。
 
十二。複雜sql的編寫
1. groupby和having, with rollup, bit函數,rand()函數
 
十三。優化SQL語句
1. show status命令來了解當前數據庫的狀況,好比查詢更新的比例,事務執行狀況,慢查詢的次數,鏈接次數等
2. 慢查詢日誌必定要開啓,經過查看慢查詢日誌來定位執行很慢的sql語句。show processlist命令能夠查看當前mysql在進行的線程,包括線程的狀態,是否鎖表。
3. 使用explain和desc命令來查詢sql執行計劃。關於explain命令的詳細解釋:
4. sql執行使用的索引問題。
5. 按期分析表和檢查表,優化表。
6. 大批量插入數據,先關閉索引更新而後load,再打開索引。
7. innodb類型的表按照主鍵順序保存,因此導入數據按照主鍵順序排列能夠提升導入數據的效率。在導入數據前關閉惟一性校驗也能夠提升導入效率。
 
 
十四。索引
1. myisam存儲引擎的表的數據和索引是分開存儲的,innodb存儲引擎的表的數據和索引時存儲在同一個表空間裏的。
2. 查詢中使用索引的最主要條件是查詢條件中使用了索引關鍵字,若是是多列索引,那麼只有查詢條件使用了多列關鍵字最左邊的前綴時纔可使用索引,不然不能使用索引,索引具備前綴特性。
3. mysqlBTREE索引的詳細解釋:
4. 對於like查詢,後面若是是常量而且只有%不在第一個字符,索引纔可能被使用
5. mysql在如下狀況下不會使用索引:好比使用索引比全表掃描更慢,hash索引where條件中不使用=,用or分隔開的條件,若是or前的條件中的列有索引,後面列中沒有,那麼不會用到索引。
6. 使用show status like "Handler_read%"查看索引使用狀況
 
十五。優化數據庫對象
1. 優化表的數據類型,在表運行一段時間以後使用函數procedure analyse來對錶進行分析,優化表的字段類型。
2. 對錶進行拆分,包括垂直拆分和水平拆分。垂直拆分之後查詢全部數據須要join,水平拆分查詢數據須要union。水平拆分能夠按照時間或者按照某個列
3. 設計表的時候能夠適當的增長冗餘字段,這樣能夠下降鏈接操做的需求,沒必要死守數據庫規範。可是這樣在更新的時候可能會形成數據的不一致,因此須要按期更新或者使用觸發器。
 
十六。鎖問題
1. 鎖衝突是影響數據庫併發訪問性能的一個重要因素。因此理解sql語句執行的時候是否會加鎖以及加什麼鎖很重要。主要用到mysql表所和innodb行鎖。
2. mysql鎖分爲表級鎖,行級鎖,頁面鎖。innodb支持行級鎖和表級鎖。myisam支持表鎖。表級鎖不會出現死鎖,可是鎖定粒度大,發生鎖衝突的機率最高,併發度最低。行級鎖開銷大,會出現死鎖,鎖定粒度最小,發生鎖衝突的機率最低,併發度也最高。
3. myisam在執行查詢select前,會自動給涉及的全部表加讀鎖,在執行(update,delete,insert)前,會自動給涉及的表加寫鎖。可是顯式加鎖必需要手動解鎖,在執行lock tables後,只能訪問顯式加鎖的這些表,不能訪問未加鎖的表。myisam老是一次得到SQL語句鎖須要的所有鎖,因此myisam表不會出現死鎖。
4. myiasm表鎖的例子:
5. innodb鎖問題。
 
十七。事務
1. 事務ACID屬性,原子性:事務是一個原子操做單元,其對數據的修改,要麼全都執行,要麼全都不執行。一致性:在事務開始和完成時,數據都必須保持一致狀態。隔離性:數據庫系統提供必定的隔離機制,保證事務在不受外部併發操做影響的獨立環境執行。持久性:事務完成以後,它對於數據的修改是永久性,及時出現系統故障也可以保持。
2. 併發事務處理會提升數據庫系統的事務吞吐量,從而能夠支持更多的用戶,可是也會帶來一些問題,主要包括:更新丟失,髒讀,不可重複讀,幻讀。
3. 更新丟失是應用的責任,髒讀不可重複讀以及幻讀,這是數據庫讀一致性的問題,必須由數據庫提供必定的事務隔離機制來解決。數據庫實現事務隔離的方式,基本上分爲兩種,一種是加鎖,另一種是MVCC(不加鎖,經過必定機制生成一個數據請求時間點的一致性數據快照)
4. 爲了處理隔離與併發的矛盾,有4個事務隔離級別,RU,RC,RR,S。事務隔離級別對應的例子:
 
十八。備份和恢復
1. mysql的主從備份就是slave mysql在不斷的作基於BINLOG的恢復。主從備份有多重級別,好比基於行級別,或者基於sql語句級別,或者二者兼顧
3. 備份分爲邏輯備份和物理備份,邏輯備份使用mysqldump,myisam存儲引擎在備份的時候須要加鎖來保證數據的一致性,對於innodb來講經過--single-transaction能夠得到一個快照,這樣使備份的數據可以保持一致性。恢復很簡單,直接將mysqldump的輸出當成輸入執行便可。能夠打開備份文件看看內容。
4. 表的導出能夠select into outfile,mysqldump也能夠。導入能夠用load data infile。
 
十九。mysql日誌
1. mysql有四種日誌,分別是錯誤日誌,二進制日誌(binlog日誌),查詢日誌和慢查詢日誌。
2. 錯誤日誌用於記錄數據庫出現的問題,當系統故障的時候首先要檢查錯誤日誌。 
3. 二進制日誌使用mysqlbinlog來查看,binlog比較大,須要按期刪除。在主從備份的環境中須要確保從庫已經拷貝了binlog,以避免備份發生問題。
4. 查詢日誌記錄了客戶端的查詢操做,對於訪問頻繁的系統,此日誌對系統性能的影響比較大。通常關掉
5. 慢查詢日誌記錄了包含全部執行時間超過參數long_query_time所設置值的sql語句的日誌。
 
二十。mysql權限
1. mysql的權限是經過用戶名和ip地址來肯定的。mysql數據庫裏面的user,host,db表
 
 
 
 
參考資料:書籍《深刻淺出,mysql數據庫開發,優化與管理維護》
相關文章
相關標籤/搜索