2018MySQL面試知識點整理

  1. mysql 查詢子句:mysql

    1. group by 多個字段,group by 前可以使用聚合函數,
    2. having: 對查詢後結果的篩選 和where後面的語法相似
  2. 字段別名 表別名 as
  3. 子查詢算法

    1. 子查詢結果做爲父查詢的表 select xxx from (子查詢) as 子查詢結果命名
    2. 子查詢做爲字段使用: select xxx from table where id in(select id ...)
    3. 子查詢能夠跨多個表

  1. 隔離級別:sql

    1. 未提交讀(Read uncommitted),可能產生:髒讀,不可重複讀,幻讀
    2. 讀已提交(Read committed),可能產生:不可重複讀,幻讀
    3. 可重複讀(Repeatable read):可能產生:幻讀
    4. 串行化(Serializable):可能產生:無
    5. mysql默認級別:可重複讀session

      1. select @@global.tx_isolation;
      2. select @@session.tx_isolation;
      3. set global transaction isolation level read committed; //全局的
      4. set session transaction isolation level read committed; //當前會話
  2. mvcc(Multi Version Concurrency Control):爲了實現快照讀(讀寫不衝突)併發

    1. redo log: mysql將事務操做過程當中產生redo log,事務提交時flush到硬盤(順序的)mvc

      1. 當主機崩潰重啓,能夠從redo log獲取日誌恢復
    2. undo log: 事務操做過程當中,記錄修改的回滾操做,事務回滾能夠用上app

      1. mysql根據 undo log 能夠回溯到某個版本,實現mvcc
    3. innodb是以彙集索引組織數據的。數據行中包含rowid(主鍵id),還包括:函數

      1. trx_id:最近修改的事務id
      2. db_roll_ptr:指向undo分段中的undo log
  3. 當前讀:特殊的讀操做,須要加鎖:工具

    1. select * from table where ? lock in share mode;(共享鎖)
    2. select * from table where ? for update;(互斥鎖)
    3. insert into table values(...);(互斥鎖)
    4. update table set ? where ?;(互斥鎖)
    5. delete from table where ?;(互斥鎖)
    6. mysql事務操做多行記錄是一條一條操做的,獲取一條 -> 加鎖 -> 操做完 -> 解鎖; 繼續下一條...
  4. 行級鎖是鎖索引,的前提條件是要匹配索引,不然退化爲表鎖(鎖彙集索引);優化

    1. 若是隻有二級索引,先鎖二級索引,再鎖彙集索引(可能會產生死鎖)
  5. mysql加鎖順序:無論事務有多少語句,只有兩階段鎖,合併加鎖和合並解鎖
  6. rr隔離級別能防止幻讀:由於會加gap鎖,其餘事務不能插入記錄
  7. 幻讀的例子:RR級別下面:圖片描述
  8. 死鎖的例子:

    1. session1: select * from t1 where id=22 for update;

      1. empty set
    2. session2: select * from t1 where id=23 for update;

      1. empty set
    3. session1: insert into t1 values(22, ...);

      1. 一直未返回
    4. session:2 insert into t1 values(23, ...);

      1. Error 1213 (40001): Deadlock found when trying to get lock; ...
    5. 分析:

      1. 當在存在的行進行鎖的時候,mysql只有行鎖
      2. 當對爲存在的行進行鎖的時候,mysql會鎖住一段範圍(gap鎖)
          1. 範圍:
              1. 上述例子(id22,23都不存在):
                  1. 假設以前表有id(11,12),鎖住的範圍:(12,無窮大)
                  2. 假設以前表有id(11,30),鎖住的範圍:(11,30)
                  3. 假設以前表有id(50,xxx),鎖住的範圍:(無窮小,50)

  1. 錶鏈接

    1. 笛卡爾積:A X B = { (a,b) | a ∈ A and b ∈ B }, (a,b) 叫作有序偶

      1. 笛卡爾積的數量= num(A) * num(B)
    2. 不加任何規則的鏈接:select * from users,table2,結果是笛卡爾積

      1. 若是帶了where語句,只篩選出對應表的符合記錄的行
      2. 和不帶鏈接規則的 inner join一致
    3. inner join:內鏈接,

      1. 若是不帶鏈接規則和上面同樣,mysql中 cross join 和 inner join相似
      2. 若是帶鏈接規則,結果爲笛卡爾積中去掉不知足鏈接規則的記錄
      3. 鏈接規則的類型:
          1. 等值
          2. 不等值
          3. 自鏈接(相同表不一樣字段)
    4. 外鏈接:

      1. left join: 左表全 右表沒有就算null
      2. right join:

  1. 聯合查詢: union

    1. 聯合查詢將兩個查詢的結果組合在一塊兒展現,後面的結果append前面sql的結果,而且字段名用簽名sql的字段
    2. 聯合查詢的兩個sql 結果 字段數量必須相等

  1. GTID複製:mysql5.6+

    1. GTID=source_id:transaction_id
    2. 從故障恢復:CHANGE MASTER TO MASTER_HOST='xxx', MASTER_AUTO_POSITION
  2. 主從複製

    1. 須要指定binglog的文件和pos

  1. 索引:

    1. B+Tree:B的含義:多是名字
    2. 與BTree的區別:數據只保存在葉子節點,葉子節點順序單鏈表
    3. 彙集索引:innodb組織數據的方式,innodb經過主鍵彙集數據
    4. 二級索引:innodb其餘索引只存主鍵id
    5. 二級索引優化:覆蓋索引,當查詢的字段剛好在二級索引上,則再也不查主鍵索引
    6. 聯合索引的匹配規則:最左原則

      1. 不知足,可能出現兩個狀況:
          1. 次級字段的全部記錄是有序的,此時explain中的type=index,表示掃描全index
          2. 不是有序的,用不到索引
    7. explain(關鍵字段):

      1. select_type:查詢類型,
          1. simple:通常是簡單查詢,不使用union或子查詢
          2. subquery:子查詢中的第一個select
          3. primary:最外層的select
      2. type:mysql找到所需行的方式,又叫「訪問類型」,由差到好的順序:
          1. type=ALL:全表掃描(通常須要進行優化)
          2. type=index:整個索引掃描(不知足最左匹配可能會引發)
          3. type=range:使用一個索引來檢索給定範圍的行
          4. type=ref:mysql會根據特定的算法快速查找到某個符合條件的索引,而不是會對索引中每個數據都進行一一的掃描判斷
          5. type=eq_ref:相似ref,區別是使用的索引是惟一索引
          6. const、system:常量匹配,主鍵匹配
      3. rows:找到所需記錄須要讀取的行數(估計值)
      4. extra:詳細信息,常見:
          1. Using index:只查詢索引就能獲得結果(覆蓋索引)
          2. Using where:須要經過索引再檢索實際數據進行過濾
          3. Using temporary:使用臨時表
          4. Using filesort:使用臨時文件排序
    8. like "%xxx" 不知足最左匹配,會致使全表掃描
    9. null與索引的關係:

      1. is null 是可使用索引的
      2. is not null 不能
      3. 但最好能不用null就不用

  1. online ddl

    1. 通常狀況經過新建臨時表實現,參考:https://cloud.tencent.com/dev...

      1. 新建臨時表爲最新的表結構,在業務低峯期加鎖拷貝數據到新表,rename舊錶和新表
      2. 其餘實現:
          1. Facebook工具pt-osc 經過觸發器同步變化數據 不鎖表
          2. gh-ost,經過主從同步binlog方式
    2. mysql5.6+支持在線online ddl

      1. 但執行開始也須要一個短暫鎖表的過程,準備元數據
      2. 分爲 inplace 和 copy
          1. 添加字段 可能inplace 和 copy 但支持併發的dml
      3. frm文件是表結構定義
      4. mysiam: table.frm, table.MYD, table.MYI
      5. innodb: table.frm, *.idb 
      6. innodb_file_per_table

其餘參考資料:
mysql加鎖處理分析
http://hedengcheng.com/?p=771
MySQL基於GTID的複製實現詳解
http://www.ywnds.com/?p=3898

相關文章
相關標籤/搜索