天天看點

Mysql經典面試題彙總

1.ACID 是什麼?

       答:  mysql的ACID是指事務的 原子性,一緻性,隔離性,持久性。 其中原子性是基于 Redo/undo log機制來實作的, Redo log 記錄的是事務更新後的記錄值,undo log 記錄的是事務更新後的記錄,更新失敗後,就可以根據undo log來進行復原。

原子性:   一個事務必須視為一個不可分割的最小工作單元,整個事務裡的操作要麼全部執行成功,要麼全部失敗。

一緻性:   事務總是總一個一緻性狀态轉換到另一個一緻性狀态。

隔離性:  一個事務所做的修改,在最終送出之前,其他事務是不可見的。

持久性:  事務裡的所有操作最終會寫入到資料庫裡。

2. mysql的索引類型包含哪幾種?

Mysql經典面試題彙總

 1) fulltext 索引

      适用于大檔案text類型以及大小超過text類型的字段。 

 2) NORMAL普通索引

      使用經常使用的字段或者當關聯表的一些字段。

 3) UNIQUE 唯一性索引

      當有多個字段一起表示唯一時,可以使用唯一性索引進行限制,比如使用者表裡的, 使用者名和賬号需要唯一并且不為空,那麼就将 這2個字段設定一個唯一性的索引。

3. mysql的explain關鍵字用法?

      一般用于在查詢前添加explain,用于解釋查詢出來的語句包含的資訊。

4. mysql的binLog是什麼? 

      binlog是mysql用于資料收集和資料恢複的日志管理工具。

5. 你知道mysql的最左索引比對規則嘛?

     答:  當有多個字段共同做為 索引時,如(a,b,c),如果說隻用到了b,c那麼最左索引比對就會認為該索引無效,如果用到了a,c或者a,b,那麼索引就會生效。

6.  mysql的鎖有哪幾種?

     答: 根據加鎖的範圍,可分為全局鎖(全庫邏輯備份)、表級鎖(表鎖(表記錄)、中繼資料鎖MDL(修改表結構))、行鎖。

     全局鎖:  給整個資料庫加一個全局的讀鎖,表示隻有目前線程能夠讀取到該資料庫,其他線程不能進行讀取和修改。

      格式:   Full tables with read lock

     表級鎖: 

     表鎖和中繼資料鎖(MDL)

      格式:   lock tables 表名 read;

Mysql經典面試題彙總

    設定表鎖後,不能對該表進行修改操作。 

    行鎖:   

     兩段鎖、 一緻性非鎖定讀(MVCC多版本并發控制, innodb會用快照的形式儲存曆史資訊)、一緻性鎖定讀(可以解決幻讀問題)。

     一緻性鎖定讀:

       select .. for update    

       select ... lock in share mode

        可以通過加一緻性鎖定讀,當2次查詢期間有insert語句過來的時候,會進入到阻塞狀态,直至讀取完畢後,再insert。

  • Record Lock:單個行記錄上的鎖
  • Gap Lock:間隙鎖,鎖定一個範圍,但不包含記錄本身
  • Next-Key Lock:Gap Lock+Record Lock,鎖定一個範圍,并且鎖定記錄本身

7. mysql常用指令?

1) 檢視系統參數

         使用指令 show variables like "%params%"   ;

         ①檢測mysql檢測死鎖機制是否開啟5.7:  

show variables like "%innodb_deadlock_detect%"
           

  該指令表示如果開啟死鎖檢測機制,那麼出現死鎖,會随機自動釋放一個在死鎖的事務。

Mysql經典面試題彙總

        ② 查詢binlog變量

show variables like "%binlog%";
           

2)查詢資料庫事務的隔離級别

       select @@transaction_isolation     mysql預設的事務隔離級别為: 可重複讀。

Mysql經典面試題彙總

3) explain指令, 解釋sql

      例如可以檢視查詢的語句是否用到索引

Mysql經典面試題彙總

8. mysql的MYISAM存儲引擎和Innodb存儲引擎有什麼差別,哪個性能好?

        答:   差別:

               1) myisam存儲引擎不支援事務,對于不需要事務的操作時,myisam的查詢和插入的性能比innodb快的多。

               2)  myisam 不支援外鍵,innodb支援外鍵。

               3) myisam 隻支援表級鎖,Innodb支援表級鎖(表鎖和中繼資料鎖)和行鎖(兩階段鎖、一緻性非鎖定讀(MVCC)、一緻性鎖定讀(select … for update,select … lock in share mode))。

9.mysql為什麼用B+樹做索引?

     答: 

     1) B+樹是一種排序好的資料結構。

      2)與普通的二叉樹相比,B+樹隻在葉子節點做存儲,在同樣的記憶體下,B+樹葉子能夠存儲更多的節點數量,周遊起來更快速友善。

      3) B+樹是一一種平衡的多叉樹,能夠做更少的磁盤I/O, 另外葉子節點也可以連接配接起來,加快周遊。

10.mysql的 sql執行順序是怎麼樣的?

    答:   如: select * from A  left join B on A.c=B.d  where A.e="1" order by A.g;

         第一步先将A表和B表做笛卡爾乘積。

         第二步再通過on将上面的笛卡爾乘積的結果集進行第一次篩選。

         第三步 将A表多餘的行,即沒有比對到B表的行接入到上面篩選的On結果集後,空的用null填充。

         第四步用where對結果集進行篩選。

         第五步再通過order by 對結果集作排序。

11.資料庫的事務隔離級别有哪幾種方式?分别有什麼優缺點? 

1. 讀未送出,一個事務能夠讀取到另一個事務未送出的記錄。   

2. 讀已送出,事務隻能讀取到已經送出的記錄, 會出現不可重複讀的問題,即同一個事務多次讀取到的結果是不相同的。

3. 可重複讀,即同一個事務,多次查詢讀取的記錄是 相同的,但是會出現幻讀的問題,即在讀取結果的一瞬間,另外一個事務突然向資料庫裡插入了一條記錄,那麼前面的事務好像多讀取了一條記錄的問題。可用mvcc解決幻讀的問題,多版本控制。

4.可串行化,是資料庫的隔離的最進階别,不會出現髒讀、不可重複讀、幻讀的問題,但性能比較差。

12. mysql 的check用法? 

      答:   給字段添加一個限制, 在建表的時候通過check(字段>1) 給字段的值限制範圍,即限制字段能為什麼值。

13. mysql的binlog日志預設存放在哪兒?

           1) 檢視日志檔案路徑

             show master status

Mysql經典面試題彙總
Mysql經典面試題彙總

        2)在my.ini檔案中 檢視bin_log檔案

    we

Mysql經典面試題彙總
Mysql經典面試題彙總

14. mysql 自增主鍵出現不連續的原因?

答: mysql自增主鍵不連續的情況原因有三個: 

     1) 唯一鍵沖突

     2) 事務復原

     3) insert...select的時候會出現主鍵id每次雙倍配置設定導緻主鍵id跳過的問題

      參考部落格

 insert into ..select .. 

CREATE TABLE `t1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `c` int(11) DEFAULT NULL,
  `d` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `c` (`c`)
) ENGINE=InnoDB;

insert into t1 values(null, 1,1);
insert into t1 values(null, 2,2);
insert into t1 values(null, 3,3);
insert into t1 values(null, 4,4);
create table t2 like t1;
insert into t2(c,d) select c,d from t1;
insert into t2 values(null, 5,5);

select * from t2;
           

 查詢結果為:

Mysql經典面試題彙總

15.  mysql的慢查詢預設時間為多長? 

        答:  10 S

Mysql經典面試題彙總

16. 聚簇索引和非聚簇索引的差別是什麼? mysql 為什麼用自增的id适合作為主鍵?

        答:  聚簇索引在Mysql裡是唯一的,索引和資料存儲在一起,非聚簇索引指索引和資料沒有放一起,類如書本後的附錄目錄。

               因為mysql 的自增id , 正好是mysql的聚簇索引的資料的實體存放順序和索引存放順序是一緻的。隻要索引是相鄰的,那麼在磁盤上的位置也是相鄰的,如果不是自增的情況,那麼會出現更多次的磁盤io情況。

繼續閱讀