首頁 >資料庫 >mysql教程 >你需要掌握的13個MySQL索引知識點

你需要掌握的13個MySQL索引知識點

angryTom
angryTom轉載
2020-02-14 17:55:272398瀏覽

這篇文章介紹了MySQL索引的13個知識點,相信對各位面試非常有幫助,現在將它分享給各位。

你需要掌握的13個MySQL索引知識點

資料庫索引有關的知識,說實在的,真的是很複雜,本來想好好看看這方面的東西,然後寫篇文章詳細談談的,後來發現索引的知識太難太深,要談得全面又詳細真的很難,所以最後還是把自己學到的和想到的變成下面一個個的問題,希望能對大家幫助!

知識點

問題1:什麼是資料庫索引?

資料庫索引是資料庫系統中一個重要的概念,索引也叫做 key ,是用來提升資料庫查詢效率的資料結構,我們可以把索引理解成一本書的目錄,透過目錄我們可以快速找到對應章節的內容,同樣的,透過資料庫索引,我們可以快速找到資料表中對應的記錄。

總而言之,索引就像是為資料表建立了一個目錄。

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

1 . 使用索引大大減少了儲存引擎需要掃描的資料量,如果沒有使用索引的話,每查詢一行資料都要對資料表進行掃描,這樣的話會非常慢。

2 . 由於索引已經排好序的,所以對資料表進行 ORDER BY 和 GROUP BY 等操作時,可以很快得到結果。

3 . 索引可以將隨機的 I/O 轉為順序的 I/O ,避免高昂的磁碟 IO 成本,提升查詢效率。

問題3:MySQL索引在哪個模組中實作的?

(免費學習影片教學推薦:mysql影片教學

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

問題4:為什麼設定了索引卻不行?

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

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

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

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

SELECT * FROM users WHERE name LIKE '张%';

 OR 語句前後沒有同時使用索引,例如下面的語句, 字段id 有索引,而欄位name 沒有建立索引,那麼下面的語句只能全表掃描,無法用到索引:

SELECT * FROM users id = 10 or name='test'复制代码

 問題5:MySQL索引底層使用什麼資料結構?

在 MySQL 中,大部分情況下,索引都是使用 B-Tree 作為底層資料結構, B-Tree 只是一種泛稱,實際上不同的儲存引擎使用 B-Tree 時,有不同的變種,例如 InnoDB 使用的是 B Tree 。

另外也有一些特殊的索引結構,例如哈希索引,哈希索引底層則使用的是哈希表,在 MySQL中,只有 Memory 存儲引擎支援哈希索引。

問題6:什麼情況下資料表不適合建立索引?

1 . 對於用於儲存歸檔歷史資料的且很少用於查詢的資料表,不建議建立索引。

2 . 資料量比較小的資料表,而且未來資料也不會有太大成長的數據,不應該建索引,例如用於保存配置的資料表。

3 . 修改頻繁,且修改效能遠大於查詢效能時,不應該再建立索引。

問題7:什麼是回表?

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

當我們透過主鍵查詢時,只需要搜尋主鍵索引的搜尋樹,直接可以得到記錄的資料。

當我們透過普通索引進行查詢時,透過搜尋普通索引的搜尋樹得到主鍵的位址之後,還要再使用該主鍵對主鍵搜尋樹進行搜索,這個過程稱為回表。

問題8:叢集索引與非叢集索引的差異?

叢集索引:叢集索引的順序就是資料的實體儲存順序,並且索引與資料放在一塊,透過索引可以直接擷取數據,一個資料表中僅有一個叢集索引。

非聚集索引:索引順序與資料物理排列順序無關,索引檔案與資料是分開存放。

問題9:MySQL主鍵索引、唯一索引與普通索引的差別?

設定為主鍵索引的欄位不允許為 NULL ,而且一張資料表只能有一個主鍵索引。

設定為唯一索引的字段,其字段值不允許重要。

普通索引可以包含重复的值,也可以为 NULL 。

问题10:索引可以提高查询性能,那是不是索引创建越多越好?

索引作为一个数据表的目录,本身的存储就需要消耗很多的磁盘和内存存储空间。

并助在写入数据表数据时,每次都需要更新索引,所以索引越多,写入就越慢。

尤其是糟糕的索引,建得越多对数据库的性能影响越大。

问题11:MyISAM与InnoDB在处理索引上有什么不同?

MyISAM 存储引擎是非聚族索引,索引与数据是分开存储的,索引文件中记录了数据的指针

而 InnoDB 存储引擎是聚族索引,即索引跟数据是放在一块的, InnoDB 一般将主键与数据放在一块,如果没有主键,则将 unique key 作为主键,如果没有 unique key ,则自动创建一个 rowid 作为主键,其他二级索引叶子指针存储的是主键的位置。

问题12:什么是索引的最左前缀原则?

MySQL 数据库不单可以为单个数据列创建索引,也可以为多个数据列创建一个联合索引,比如:

CREATE TABLE test(
    a INT NOT NOT,
    b INT NOT NOT,
    KEY(a,b)
);

 当我们使用下面的查询语句时,由于 WHERE 语句中查询的条件就是联合索引,所以可以很快查询到数据。

SELECT * FROM test WHERE a=1 AND b=1;

 同样,下面的语句也会利用上面创建的联合索引,这是因为 MySQL 会按照索引创建的顺序进行排序,然后根据查询条件从索引最左边开始检测查询条件是否满足该索引,由于字段 a 在最左边,所以满足索引。

SELECT * FROM test WHERE a=1;

而使用 字段b 进行查询时,则为满足,因为从最左边匹配到的是 字段a ,所以 MySQL 判断为不满足索引条件。

SELECT * FROM test WHERE b=1;

从上面例子可以很好地了解索引的最左前缀原则,同时也说明了索引顺序的重要性。

问题13:什么是覆盖索引?

如果一个索引中包含查询所要的字段时,此时不需要再回表查询,我们就称该索引为覆盖索引。

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

SELECT id FROM users WHERE id BETWEEN 10 AND 20;

小结

当然,上面列出的只是索引的一小部分知识点,有什么回答不对的地方,欢迎指出。

以上是你需要掌握的13個MySQL索引知識點的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:cnblogs.com。如有侵權,請聯絡admin@php.cn刪除