MySQL面試題總結 一

2021-09-29 15:09:41 字數 3896 閱讀 7982

1、索引概念

簡單來說索引是乙個幫助我們快速查詢資料的資料結構。對於mysql資料庫來說,索引是乙個排序的列表,在這個列表中儲存著索引的值和包含這個值的資料所在行的實體地址,在資料十分龐大的時候,索引可以大大加快查詢的速度,這是因為使用索引後可以不用掃瞄全表來定位某行的資料,而是先通過索引表找到該行資料對應的實體地址然後訪問相應的資料。

2、索引具體採用哪種資料結構

索引採用的資料結構和資料庫採用的儲存引擎有關,在mysql中用的最多的是hash索引和b+樹索引,mysql預設儲存引擎是innodb,採用的就是b+樹索引。

3、hash索引與b+樹索引有什麼區別和各自優劣

hash索引底層是hash表,通過呼叫hash函式就可以獲取到相應的鍵值,之後進行回表查詢獲得實際資料。

b+樹底層實現是多路平衡查詢樹,每一次查詢都是從根節點出發,查詢到葉子節點才能獲取到相應的鍵值,然後根據查詢判斷是否需要回表操作。

因為hash索引底層實現是雜湊表,雜湊表是以key-value儲存資料的結構,多個資料在儲存順序上是沒有任何關係的,因此當進行範圍查詢的時候就需要進行全表掃瞄了而不能直接通過索引查詢。所以雜湊索引只適合等值查詢。b+樹索引的底層實現是多叉平衡查詢樹,它的節點是天然有序的,所以對於範圍查詢的時候不需要掃瞄全表。

另外hash索引不支援多列聯合索引的最左匹配原則,當有大量重複鍵值的情況下由於存在雜湊碰撞會導致hash索引的效率會很低,而b+樹的查詢效率比較穩定,對於所有的查詢都是從根節點到葉子節點,且樹的高度較低。除此之外hash索引不支援按照hash索引排序。

hash索引任何時候都避免不了回表查詢資料,而b+樹在符合某些條件(聚簇索引,覆蓋索引等)的時候可以只通過索引完成查詢。

4、聚簇索引與覆蓋索引

在b+樹中葉子節點可能儲存了當前key的鍵值,也可能儲存了當前key值和其對應的一整行資料,這就是非聚簇索引和聚簇索引。

在 innodb 裡,索引b+ tree的葉子節點儲存了整行資料的是主鍵索引,也被稱之為聚簇索引。而索引b+ tree的葉子節點儲存了主鍵的值的是非主鍵索引,也被稱之為非聚簇索引。

聚簇索引與非聚簇索引的區別簡而言之如下:

聚簇索引:將資料儲存與索引放到了一塊,索引結構的葉子節點儲存了行資料;

非聚簇索引:將資料與索引分開儲存,索引結構的葉子節點指向了資料對應的位置。

關於聚簇與非聚簇索引的詳細內容閱讀:

mysql資料庫索引底層原理

聚簇索引與非聚簇索引那個查詢更快及原因

聚簇索引查詢更快,因為聚簇索引葉子節點儲存的是鍵值對應的資料本身,而非聚簇索引葉子節點儲存的是主鍵值,查詢到主鍵值之後還要在通過主鍵值查詢行資料。

非聚簇索引一定會回表查詢從而查詢多次嗎

不一定,覆蓋索引(covering index)指乙個查詢語句的執行只用從索引中就能夠取得,不必從資料表中讀取。也可以稱之為實現了索引覆蓋。 當一條查詢語句符合覆蓋索引條件時,mysql只需要通過索引就可以返回查詢所需要的資料,這樣避免了查到索引後再返回表操作,減少i/o提高效率。

索引覆蓋是一種避免回表查詢的優化策略。具體的做法就是將要查詢的資料作為索引列建立普通索引(可以是單列索引,也可以乙個索引語句定義所有要查詢的列,即聯合索引),這樣的話就可以直接返回索引中的的資料,不需要再通過聚集索引去定位行記錄,避免了回表的情況發生。要注意的是,不是所有型別的索引都可以成為覆蓋索引的。因為覆蓋索引必須要儲存索引的列值,而雜湊索引、空間索引和全文索引等都不儲存索引列值,所以mysql只能使用b-tree索引做覆蓋索引。

關於聚簇索引與非聚簇索引的詳細資訊閱讀:

**聚簇索引和非聚簇索引的區別

5、聯合索引及最左匹配原則

假設有s1表,包含有name、age、score三個字段以及其他字段

alter

table s1 add

index

(name,age,score)

;//建立聯合索引

對於包含了(a,b,c)三個欄位的聯合索引,相當於a、ab、abc三個索引,乙個聯合索引可以當作多個單索引使用,大大減少了寫操作的開銷和磁碟空間的開銷。對於聯合索引(abc),當查詢語句如下:

select

*from s1 where a=

'a'and c =

'c';

的時候也會使用索引,但是只使用了(a),c並沒使用

聯合索引的最左字首匹配原則:

顧名思義是最左優先,以最左邊的為起點任何連續的索引都能匹配上,

注:如果第乙個欄位是範圍查詢需要單獨建乙個索引

注:在建立聯合索引時,要根據業務需求,where子句中使用最頻繁的一列放在最左邊

6、mysql事務

事務:在mysql中只有使用了innodb引擎的資料庫或表支援事務,資料庫可以用來維護資料庫的完整性,保證成批的資料庫要不全部執行要不全部不執行。

7、事務的四個特性acid

①、原子性:atomicity,乙個事務中的操作要麼全部執行,要麼全部不執行,不會結束在某個中間的環節。事務在執行的過程中發生錯誤,會被回滾到事務開始前的狀態,就好像從來沒有執行這個事務。

②、一致性:consistency,事務開始和結束之後資料庫的完整性不會被破壞。

③、隔離性:isolation,資料庫允許多個併發事務同時對其資料進行讀寫和修改,隔離性可以防止多個事務併發執行時由於交叉執行而導致資料的不一致。事務隔離分為不同級別,包括讀未提交(read uncommitted)、讀提交(read committed)、可重複讀(repeatable read)和序列化(serializable)。

④、永續性:durability,事務處理結束後,對資料的修改就是永久的,即便系統故障也不會丟失。

8、同時有多個事務在進行會怎麼樣呢?

多事務的併發進行一般會造成以下幾個問題:

9、怎麼解決8的這些問題呢?mysql的事務隔離級別了解嗎?

mysql的四種隔離級別如下:

未提交讀(read uncommitted)

這個隔離級別下,其他事務可以看到本事務沒有提交的部分修改。因此會造成髒讀的問題(讀取到了其他事務未提交的部分,而之後該事務進行了回滾)。

這個級別的效能沒有足夠大的優勢,但是又有很多的問題,因此很少使用.

已提交讀(read committed)

其他事務只能讀取到本事務已經提交的部分。這個隔離級別有不可重複讀的問題,在同乙個事務內的兩次讀取,拿到的結果竟然不一樣,因為另外乙個事務對資料進行了修改。

repeatable read(可重複讀)

可重複讀隔離級別解決了上面不可重複讀的問題(看名字也知道),但是仍然有乙個新問題,就是幻讀,當你讀取id > 10 的資料行時,對涉及到的所有行加上了讀鎖,此時另外乙個事務新插入了一條id=11的資料,因為是新插入的,所以不會觸發上面的鎖的排斥,那麼進行本事務進行下一次的查詢時會發現有一條id=11的資料,而上次的查詢操作並沒有獲取到,再進行插入就會有主鍵衝突的問題。

serializable(可序列化)

這是最高的隔離級別,可以解決上面提到的所有問題,因為他強制將所有的操作序列執行,這會導致併發效能極速下降,因此也不是很常用。

10、innodb使用的是哪種隔離級別呢?

innodb預設使用的是可重複讀隔離級別。

11、mysql中的鎖

閱讀:mysql中的鎖(表鎖、行鎖,共享鎖,排它鎖,間隙鎖)

MySql面試題總結

mysql主要考察方向 基本sql的編寫能力 資料庫鎖和索引的原理 事務 1.資料庫的三正規化是什麼?第一正規化 表中的列只能含有原子性 每個屬性不可再分 的值。每一列都是單獨的屬性,不可再分,但是存在資料冗餘大,插入異常,刪除異常,修改異常的問題。冗餘大 對應的屬性都一樣,在表中一直在重複這個屬性...

面試題總結(一)

這段時間找實習,碰到一堆算是經典的面試題。回答得不是很好,這裡總結一下,順便搜搜網上的答案。1 棧和堆的區別。管理方式不同 棧,由編譯器自動管理,無需程式設計師手工控制 堆 產生和釋放由程式設計師控制。空間大小不同 棧的空間有限 堆記憶體可以達到4g。能否產生碎片不同 棧不會產生碎片,因為棧是種先進...

面試題總結一

按失效策略分類 強制快取 對比快取 了解詳細可參考 expires http 1.0 的字段,在響應訊息頭中,設定這個字段之後,就可以告訴瀏覽器,在未過期之前不需要再次請求。表示快取到期時間,是乙個絕對的時間 當前時間 快取時間 如 expires thu,10 nov 2017 08 45 11 ...