Mysql知識點(複習用,待整理)

數據文件:

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 查詢編號

主從複製?

  1. master將改變記錄到二進制日誌(binary log);
  2. slave將master的二進制日誌拷貝到它的中繼日誌;
  3. 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;

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