目錄
MySQL體系結構和引擎
整個流程是,上層代碼獲取連接池連接,數據庫獲取sql語句,解析,自動優化,放入緩存。調用存儲引擎。在底層文件系統操作數據。
存儲引擎:
重點看InnoDB和MyISAM。都是表級的索引,而非數據庫級別
InnoDB特性:外鍵。
InnoDB存儲方式:
InnoDB還支持事務。
MyISAM:
以下兩個僅瞭解:
範式:
以下表爲例:
系這一列不滿足第一範式,因爲這一列又分割成了兩列,所以修改後如下:
滿足第一範式之後依舊存在的問題:
因此考慮如何滿足第二範式:
因爲學號和課程名稱可以確定其他所有列是唯一,所以這兩個接近碼,不過這個碼並沒有實現完全依賴,即單學號就可以確定姓名,姓名不依賴於課程。所以要消除部分依賴。因此要對錶進行拆分。
改造後滿足第二範式,但不滿足第三範式:需要消除傳遞依賴即系名依賴於學號,系主任依賴於系名。因此需要再拆分出一張表。
索引
簡單概念看圖,索引如何加快查找。innodb底層由B+樹實現。
B樹的構造:
B+樹
索引的分類:
創建索引:默認自動創建主鍵索引的
索引設計原則:
索引的使用:
注意查詢複合索引時的具體列。最左原則,必須要複合索引的第一個列纔會使用索引。
解決方案:僅查找索引內的列:覆蓋索引
如果查的列,某一條數據佔用的比例較大,比如99%都是,則不走索引。
底層會自動判斷走不走,主要看數據佔數據表的比例。多則不走索引。
查看索引使用情況:
視圖:
觸發器:
SQL優化步驟:
查詢特定表的影響的行數:global是歷史以來,不加爲當前連接。
這個id指定了表實際的查詢順序。
從上往下,效率越來越低。
filesort和temporary需要優化。
trace分析優化器:
SQL優化:
如果建表有唯一索引,默認會啓用唯一性校驗。手動關閉可加速。
order by優化:
用到的還是索引覆蓋。如果查詢的數據在索引內會有用。
多字段排序,如果一個升序,一個降序不會走索引。
建議使用union來替換:求並集。
思路二需要主鍵自增,且不能出現斷層。
忽略索引:
注意和use index的區別。force是強制使用的。
應用優化:
內存管理及優化:
注意兩者區別,Innodb還緩存數據塊和索引塊,myisam只緩存索引塊。
Mysql鎖
加了寫鎖,其他事務讀寫都得等。
InnoDB行鎖:
SQL技巧:
日期函數:
Mysql日誌:
Mysql複製: