日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

掌握這13個MySQL索引知識點,讓你面試通過率翻倍

 python_lover 2022-04-13

 

 

數(shù)據(jù)庫索引有關(guān)的知識,說實在的,真的是很復(fù)雜,本來想好好看看這方面的東西,然后寫篇文章詳細(xì)談?wù)劦?,后來發(fā)現(xiàn)索引的知識太難太深,要談得全面又詳細(xì)真的很難,所以最后還是把自己學(xué)到的和想到的變成下面一個個的問題,希望能對大家?guī)椭?/p>

知識點

問題1:什么是數(shù)據(jù)庫索引?

數(shù)據(jù)庫索引是數(shù)據(jù)庫系統(tǒng)中一個重要的概念,索引也叫做 key ,是一種用于提升數(shù)據(jù)庫查詢效率的數(shù)據(jù)結(jié)構(gòu),我們可以把索引理解成一本書的目錄,通過目錄我們可以快速找到對應(yīng)章節(jié)的內(nèi)容,同樣的,通過數(shù)據(jù)庫索引,我們可以快速找到數(shù)據(jù)表中對應(yīng)的記錄。

總而言之,索引就像給數(shù)據(jù)表建了一個目錄一樣。

問題2:為什么在使用索引?

1 . 使用索引大大減少了存儲引擎需要掃描的數(shù)據(jù)量,如果沒有使用索引的話,每查詢一行數(shù)據(jù)都要對數(shù)據(jù)表進(jìn)行掃描,這樣的話會非常慢。

2 . 由于索引已經(jīng)排好序的,所以對數(shù)據(jù)表進(jìn)行 ORDER BY 和 GROUP BY 等操作時,可以很快得到結(jié)果。

3 . 索引可以將隨機(jī)的 I/O 轉(zhuǎn)為順序的 I/O ,避免高昂的磁盤 IO 成本,提升查詢效率。

問題3:MySQL索引在哪個模塊中實現(xiàn)的?

MySQL 的索引是在存儲引擎這一層實現(xiàn)的,因此每一種存儲引擎都有不同的實現(xiàn)方式,對同一種索引的處理方式也完成不同。

問題4:為什么設(shè)置了索引卻不起作用?

如果使用以 % 開頭的 LIKE 語句進(jìn)行模糊匹配,則無法使用索引,如:

SELECT * FROM users WHERE name LIKE '%小張%';

SELECT * FROM users WHERE name LIKE '%小張';
復(fù)制代碼

 

不過以 % 為結(jié)尾則可以使用索引,如:

SELECT * FROM users WHERE name LIKE '張%';
復(fù)制代碼

 

OR 語句前后沒有同時使用索引,比如下面的語句, 字段id 有索引,而 字段name 沒有創(chuàng)建索引,那么下面的語句只能全表掃描,無法用到索引:

SELECT * FROM users id = 10 or name='test'
復(fù)制代碼

 

問題5:MySQL索引底層使用什么數(shù)據(jù)結(jié)構(gòu)?

在 MySQL 中,大部分情況下,索引都是使用 B-Tree 作為底層數(shù)據(jù)結(jié)構(gòu), B-Tree 只是一種泛稱,實際上不同的存儲引擎使用 B-Tree 時,有不同的變種,比如 InnoDB 使用的是 B+Tree 。

另外也有一些特殊的索引結(jié)構(gòu),比如哈希索引,哈希索引底層則使用的是哈希表,在 MySQL中,只有 Memory 存儲引擎支持哈希索引。

問題6:什么情況下數(shù)據(jù)表不適合創(chuàng)建索引?

1 . 對于用于存儲歸檔歷史數(shù)據(jù)的且很少用于查詢的數(shù)據(jù)表,不建議創(chuàng)建索引。

2 . 數(shù)據(jù)量比較小的數(shù)據(jù)表,而且未來數(shù)據(jù)也不會有太大增長的數(shù)據(jù),不應(yīng)該建索引,比如用于保存配置的數(shù)據(jù)表。

3 . 修改頻繁,且修改性能遠(yuǎn)大于查詢性能時,不應(yīng)該再創(chuàng)建索引。

問題7:什么是回表?

回表是對Innodb存儲引擎而言的,在 InnoDB 存儲引擎中,主鍵索引的葉子節(jié)點存儲的記錄的數(shù)據(jù),而普通索引的葉子節(jié)點存儲的主鍵索引的地點。

當(dāng)我們通過主鍵查詢時,只需要搜索主鍵索引的搜索樹,直接可以得到記錄的數(shù)據(jù)。

當(dāng)我們通過普通索引進(jìn)行查詢時,通過搜索普通索引的搜索樹得到主鍵的地址之后,還要再使用該主鍵對主鍵搜索樹進(jìn)行搜索,這個過程稱為回表。

問題8:聚簇索引與非聚簇索引的區(qū)別?

聚簇索引:聚簇索引的順序就是數(shù)據(jù)的物理存儲順序,并且索引與數(shù)據(jù)放在一塊,通過索引可以直接獲取數(shù)據(jù),一個數(shù)據(jù)表中僅有一個聚簇索引。

非聚簇索引:索引順序與數(shù)據(jù)物理排列順序無關(guān),索引文件與數(shù)據(jù)是分開存放。

問題9:MySQL主鍵索引、唯一索引與普通索引的區(qū)別?

設(shè)置為主鍵索引的字段不允許為 NULL ,而且一張數(shù)據(jù)表只能有一個主鍵索引。

設(shè)置為唯一索引的字段,其字段值不允許重要。

普通索引可以包含重復(fù)的值,也可以為 NULL 。

問題10:索引可以提高查詢性能,那是不是索引創(chuàng)建越多越好?

索引作為一個數(shù)據(jù)表的目錄,本身的存儲就需要消耗很多的磁盤和內(nèi)存存儲空間。

并助在寫入數(shù)據(jù)表數(shù)據(jù)時,每次都需要更新索引,所以索引越多,寫入就越慢。

尤其是糟糕的索引,建得越多對數(shù)據(jù)庫的性能影響越大。

問題11:MyISAM與InnoDB在處理索引上有什么不同?

MyISAM 存儲引擎是非聚族索引,索引與數(shù)據(jù)是分開存儲的,索引文件中記錄了數(shù)據(jù)的指針

而 InnoDB 存儲引擎是聚族索引,即索引跟數(shù)據(jù)是放在一塊的, InnoDB 一般將主鍵與數(shù)據(jù)放在一塊,如果沒有主鍵,則將 unique key 作為主鍵,如果沒有 unique key ,則自動創(chuàng)建一個 rowid 作為主鍵,其他二級索引葉子指針存儲的是主鍵的位置。

問題12:什么是索引的最左前綴原則?

MySQL 數(shù)據(jù)庫不單可以為單個數(shù)據(jù)列創(chuàng)建索引,也可以為多個數(shù)據(jù)列創(chuàng)建一個聯(lián)合索引,比如:

CREATE TABLE test(
    a INT NOT NOT,
    b INT NOT NOT,
    KEY(a,b)
);
復(fù)制代碼

 

當(dāng)我們使用下面的查詢語句時,由于 WHERE 語句中查詢的條件就是聯(lián)合索引,所以可以很快查詢到數(shù)據(jù)。

SELECT * FROM test WHERE a=1 AND b=1; 
復(fù)制代碼

 

同樣,下面的語句也會利用上面創(chuàng)建的聯(lián)合索引,這是因為 MySQL 會按照索引創(chuàng)建的順序進(jìn)行排序,然后根據(jù)查詢條件從索引最左邊開始檢測查詢條件是否滿足該索引,由于字段 a 在最左邊,所以滿足索引。

SELECT * FROM test WHERE a=1; 
復(fù)制代碼

 

而使用 字段b 進(jìn)行查詢時,則為滿足,因為從最左邊匹配到的是 字段a ,所以 MySQL 判斷為不滿足索引條件。

SELECT * FROM test WHERE b=1; 
復(fù)制代碼

 

從上面例子可以很好地了解索引的最左前綴原則,同時也說明了索引順序的重要性。

問題13:什么是覆蓋索引?

如果一個索引中包含查詢所要的字段時,此時不需要再回表查詢,我們就稱該索引為覆蓋索引。

比如下面的查詢中,字段id是主鍵索引,所以可以直接返回索引的值,顯著提升了查詢的性能。

SELECT id FROM users WHERE id BETWEEN 10 AND 20;
復(fù)制代碼

 

小結(jié)

當(dāng)然,上面列出的只是索引的一小部分知識點,有什么回答不對的地方,歡迎指出。

想要閱讀更多精彩內(nèi)容,可以關(guān)注我的微信公眾號:Java技術(shù)zhai,這是我的私人公眾號,專注于Java技術(shù)分享,期待你的參與。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多