數據文件:
frm文件存放表結構,myd文件存放表數據,myi文件存放表索引。
查看數據庫引擎命令:show engines
;
MyISAM 和 InnoDB的對比:
MyISAM不支持主外鍵,InnoDB支持主外鍵
;
MyISAM不支持事物,InnoDB支持事物
;
MyISAM使用的是表鎖,InnoDB使用的是行級鎖
;
MyISAM只緩存索引,不緩存數據,InoDB即緩存索引又緩存數據
;
MyISAM的表空間小,InnoDB的表空間大
;
MyISAM的關注點在性能,InnoDB的關注點在事物
;
SQL解析:
from on join where group by having select order by limit
索引:
排好序的快速查找數據結構,MySQL默認索引結構是B+Tree;
優點:提高了數據檢索的效率,降低了數據庫的IO成本
;
缺點:降低了MySQL的更新速度,既要維護數據表信息,又要維護索引信息
;
索引種類:
主鍵索引:
唯一索引:索引的列必須唯一,允許有空值
;
普通索引:單值索引(一個索引只包含一個列,一個表可以有多個單值索引)、複合索引(一個索引包含多個列)
;
全文索引:對文本的內容進行分詞,進行搜索
;
索引結構:
B-Tree:平衡多路搜索樹,它的每個葉子都可以擁有大於等個2個子節點,所以叫多路,是爲了降低高度,查詢性能提高
;
B+Tree: 在B-Tree的基礎上改造,它的數據都存在葉子節點,同時葉子節點還加了指針形成鏈表
;
爲什麼使用B+Tree 而不是紅黑樹(平衡二叉樹)?
因爲B+Tree的高度遠遠小於紅黑樹。索引文件本身也很大,不可能一次性加載進內存
;
索引的結構要儘可能的減少查找過程中磁盤IO的存取次數
;
InnoDB
是一個以主鍵索引來組織數據的存儲,具體的數據保存在葉子節點,
而輔助索引中的葉子節點保存了指向主文件的主鍵關鍵字。
比如第1塊磁盤塊裏面有P1指針、數據項17、P2指針、數據項35、P3指針, 那麼P1指針指向的是小於數據項17的磁盤塊2,裏面又分爲P1指針、數據項8、P2指針、數據項12、P3指針。 那麼p2指針指向的是在數據項17和數據項35之間的磁盤塊3,裏面又分爲P1指針、數據項26、P2指針、數據項30、P3指針。 以此類推下去
。
哪些情況下需要建立索引?
1.主鍵自動創建唯一索引
;
2.頻繁使用查詢的條件
;
3.表關聯的字段
;
4.頻繁更新的字段不適合建立索引
;
哪些情況不要創建索引?
1.表記錄太少
;
2.經常增刪改的表
;
Explain:
查看執行計劃,用來分析查詢語句或表結構的性能瓶頸。
主要有下列字段:
id :select 查詢序列號,Id越大優先級越高,越先別執行
;
type:查詢使用了何種類型,最好到最差依次是system>const>eq_ref>ref>range>index>all
;
possiable_key: 顯示可能應用到這張表的索引
;
key: 實際使用到的索引
;
rows:大致估算找到所需要的記錄需要查找的行數
;
避免索引失效?
1.全值匹配
2.最佳左前綴法則,查詢從索引最左前列開始,且不跳過中間的列
3.不在索引上做任何操作,比如計算、函數
4.不能使用索引中範圍右邊的列
5.!=會導致索引失效
6.is null 和 is not null 無法使用索引
7.like使用通配符開頭索引失效
8.少用or,用它連接時索引失效
慢查詢日誌?
是mysql提供的一種日誌記錄,記錄響應時間超過閥值的語句,默認的long_query_time = 10;結合explain進行全面分析。
查看是否開啓:show variables like '%slow_query_log%'
;
開啓:set global slow_query_log = 1
;
查看當前閥值:show variables like '%long_query_time%'
;
設置閥值:set global long_query_time = 3
;
MySQL提供了msyqldumpslow工具進行分析。
show profile?
分析當前會話中sql語句執行的資源消耗情況的工具(默認關閉,並保持15次的運行結果)。
查看是否開啓:show variables like 'profiling'
;
開啓:set profiling = on
;
查看結果:show profiles
;
診斷SQL: show profile cpu,block io for query 查詢編號
;
主從複製?
master將改變記錄到二進制日誌(binary log)
;slave將master的二進制日誌拷貝到它的中繼日誌
;salve重做中繼日誌中的事件,將改變應用到自己的數據庫,mysql的複製是異步且串行化的
鎖的分類?
對數據操作的類型:
1.讀鎖:共享鎖,不會阻塞讀,但會阻塞寫
2.寫鎖:排他鎖,當前寫操作沒有完成,它會阻斷其他寫鎖和讀鎖
從粒度分析:
1.表鎖:偏向於MyISAM存儲引擎,開銷小,加鎖快,無死鎖,鎖定力度大,併發度低
。
2.行鎖:偏向InnoDB存儲引擎,開銷大,加鎖慢,有死鎖,鎖定力度小,併發度高
;
鎖定一行:for update
eg: select column from table where id=xxx for update
優化建議?
1.儘可能讓所有的數據檢索都通過索引完成,避免行鎖升級爲表鎖
;
2.儘可能較少檢索條件,避免間隙鎖。(set b= xxx where a>1 and a <5)
;
3.儘可能控制事物大小,減少鎖定資源量和時間長度
;
查詢數據庫狀態,檢查是否有死鎖: show Engine InnoDB status
;