MySQL 這些面試知識點你都會了嗎?

MySQL的存儲引擎有那些?

  • InnoDB

這是MySQL 5.5或更高版本的默認存儲引擎。它提供了事務安全(ACID兼容)表,支持外鍵引用完整性約束。它支持提交、回滾和緊急恢復功能來保護數據。它還支持行級鎖定。當在多用戶環境中使用時,它的“一致非鎖定讀取”提高了性能。它將數據存儲在集群索引中,從而減少了基於主鍵的查詢的I/O。

  • MyISAM

該存儲引擎管理非事務性表,提供高速存儲和檢索,支持全文搜索。

  • MEMORY

提供內存中的表,以前稱為堆。它在RAM中處理所有數據,以便比在磁盤上存儲數據更快地訪問。用於快速查找引用和其他相同的數據。

  • MERGE

將多個類似的MyISAM表分組為一個表,可以處理非事務性表,默認情況下包括這些表。

  • EXAMPLE

你可以使用此引擎創建表,但不能存儲或獲取數據。這樣做的目的是教開發人員如何編寫新的存儲引擎。

  • ARCHIVE

用於存儲大量數據,不支持索引。

  • CSV

在文本文件中以逗號分隔值格式存儲數據。

  • BLACKHOLE

受要存儲的數據,但始終返回空。

  • FEDERATED

將數據存儲在遠程數據庫中。

innodb 與 myisam的區別

1 不同

<code>innodb 支持事物,而myisam不支持事物;innodb 支持行級鎖,而myisam支持表級鎖;innodb 支持mvcc,而myisam不支持;innodb 支持外鍵,而myisam不支持;innodb 不支持全文索引,而myisam支持。/<code>

2 innodb 引擎的4大特點

<code>插入緩衝(insert buffer),二次寫(double write),自適應哈希索引(ahi),預讀(read ahead)/<code>

3 2者selectcount(*)哪個更快,為什麼

<code>myisam更快,因為myisam內部維護了一個計數器,可以直接調取。/<code>

MySQL中varchar與char的區別以及varchar(50)中的50代表的涵義

1 varchar與char的區別

<code>char是一種固定長度的類型,varchar則是一種可變長度的類型/<code>

2 varchar(50)中50的涵義

<code>最多存放50個字符,varchar(50)和(200)存儲hello所佔空間一樣,但後者在排序時會消耗更多內存,因為order by col採用fixed_length計算col長度(memory引擎也一樣)/<code>

3 int(20)中20的涵義

<code>是指顯示字符的長度但要加參數的,最大為255,比如它是記錄行數的id,插入10筆資料,它就顯示00000000001 ~~~00000000010,當字符的位數超過11,它也只顯示11位,如果你沒有加那個讓它未滿11位就前面加0的參數,它不會在前面加020表示最大顯示寬度為20,但仍佔4字節存儲,存儲範圍不變;/<code>

4 mysql為什麼這麼設計

<code>對大多數應用沒有意義,只是規定一些工具用來顯示字符的個數;int(1)和int(20)存儲和計算均一樣;/<code> 

innodb 的事物與日誌實現方式

1 有多少種日誌

<code>錯誤日誌、查詢日誌、慢查詢日誌、二進制日誌、中繼日誌、事務日誌/<code>

2 事物的4種隔離級別

<code>Read Uncommitted(讀取未提交內容)、Read Committed(讀取提交內容)、Repeatable Read(可重讀)、Serializable(可串行化)/<code>

3 事物如何通過日誌來實現的

<code>事務日誌是通過redo和innodb的存儲引擎日誌緩衝(Innodb log buffer)來實現的,當開始一個事務的時候,會記錄該事務的lsn(log sequence number)號; 當事務執行時,會往InnoDB存儲引擎的日誌緩存裡面插入事務日誌;當事務提交時,必須將存儲引擎的日誌緩衝寫入磁盤(通過innodb_flush_log_at_trx_commit來控制),也就是寫數據前,需要先寫日誌。這種方式稱為“預寫日誌方式”/<code>

MySQL中InnoDB引擎的行鎖是通過加在什麼上完成(或稱實現)的?為什麼是這樣子的?

<code>InnoDB是基於索引來完成行鎖/<code>

例:select * from tab_with_index where id = 1 for update; for update 可以根據條件來完成行鎖鎖定,並且 id 是有索引鍵的列, 如果 id 不是索引鍵那麼InnoDB將完成表鎖,,併發將無從談起

數據庫是否支持emoji表情,如果不支持,如何操作?

<code>如果是utf8字符集的話,需要升級至utf8_mb4方可支持/<code>

MySQL的索引相關問題

1 索引結構

<code>在mysql中常用兩種索引結構(算法)BTree和Hash,兩種算法檢索方式不一樣,對查詢的作用也不一樣。其中我們常用的innodb 和 myisam存儲引擎默認都採用的是BTree索引結構。不過innodb存儲引擎是支持hash索引的,但是,我們必須啟用,hash索引的創建由innodb存儲引擎引擎自動優化創建,我們干預不了。/<code>

2 索引類型

<code>普通索引,唯一索引,主鍵索引,組合索引,全文索引/<code>

3 innodb也使用B+Tree作為索引結構,具體實現與myisam有何不同

<code>第一個重大區別是InnoDB的數據文件本身就是索引文件。從上文知道,MyISAM索引文件和數據文件是分離的,索引文件僅保存數據記錄的地址。而在InnoDB中,表數據文件本身就是按B+Tree組織的一個索引結構,這棵樹的葉節點data域保存了完整的數據記錄。這個索引的key是數據表的主鍵,因此InnoDB表數據文件本身就是主索引。第二個與MyISAM索引的不同是InnoDB的輔助索引data域存儲相應記錄主鍵的值而不是地址。換句話說,InnoDB的所有輔助索引都引用主鍵作為data域。/<code> 


MySQL 這些面試知識點你都會了嗎?


分享到:


相關文章: