這篇文章介紹了MySQL索引的13個知識點,相信對各位面試非常有幫助,現在將它分享給各位。
資料庫索引有關的知識,說實在的,真的是很複雜,本來想好好看看這方面的東西,然後寫篇文章詳細談談的,後來發現索引的知識太難太深,要談得全面又詳細真的很難,所以最後還是把自己學到的和想到的變成下面一個個的問題,希望能對大家幫助!
資料庫索引是資料庫系統中一個重要的概念,索引也叫做 key
,是用來提升資料庫查詢效率的資料結構,我們可以把索引理解成一本書的目錄,透過目錄我們可以快速找到對應章節的內容,同樣的,透過資料庫索引,我們可以快速找到資料表中對應的記錄。
總而言之,索引就像是為資料表建立了一個目錄。
1 . 使用索引大大減少了儲存引擎需要掃描的資料量,如果沒有使用索引的話,每查詢一行資料都要對資料表進行掃描,這樣的話會非常慢。
2 . 由於索引已經排好序的,所以對資料表進行 ORDER BY
和 GROUP BY
等操作時,可以很快得到結果。
3 . 索引可以將隨機的 I/O
轉為順序的 I/O
,避免高昂的磁碟 IO
成本,提升查詢效率。
(免費學習影片教學推薦:mysql影片教學)
MySQL
的索引是在儲存引擎這一層實現的,因此每一種儲存引擎都有不同的實作方式,對同一種索引的處理方式也完成不同。
如果使用以 %
開頭的 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
存儲引擎支援哈希索引。
1 . 對於用於儲存歸檔歷史資料的且很少用於查詢的資料表,不建議建立索引。
2 . 資料量比較小的資料表,而且未來資料也不會有太大成長的數據,不應該建索引,例如用於保存配置的資料表。
3 . 修改頻繁,且修改效能遠大於查詢效能時,不應該再建立索引。
回表是對Innodb儲存引擎而言的,在 InnoDB
儲存引擎中,主鍵索引的葉子節點儲存的記錄的數據,而普通索引的葉子節點儲存的主鍵索引的地點。
當我們透過主鍵查詢時,只需要搜尋主鍵索引的搜尋樹,直接可以得到記錄的資料。
當我們透過普通索引進行查詢時,透過搜尋普通索引的搜尋樹得到主鍵的位址之後,還要再使用該主鍵對主鍵搜尋樹進行搜索,這個過程稱為回表。
叢集索引:叢集索引的順序就是資料的實體儲存順序,並且索引與資料放在一塊,透過索引可以直接擷取數據,一個資料表中僅有一個叢集索引。
非聚集索引:索引順序與資料物理排列順序無關,索引檔案與資料是分開存放。
設定為主鍵索引的欄位不允許為 NULL
,而且一張資料表只能有一個主鍵索引。
設定為唯一索引的字段,其字段值不允許重要。
普通索引可以包含重复的值,也可以为 NULL
。
索引作为一个数据表的目录,本身的存储就需要消耗很多的磁盘和内存存储空间。
并助在写入数据表数据时,每次都需要更新索引,所以索引越多,写入就越慢。
尤其是糟糕的索引,建得越多对数据库的性能影响越大。
MyISAM
存储引擎是非聚族索引,索引与数据是分开存储的,索引文件中记录了数据的指针
而 InnoDB
存储引擎是聚族索引,即索引跟数据是放在一块的, InnoDB
一般将主键与数据放在一块,如果没有主键,则将 unique key
作为主键,如果没有 unique key
,则自动创建一个 rowid
作为主键,其他二级索引叶子指针存储的是主键的位置。
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;
从上面例子可以很好地了解索引的最左前缀原则,同时也说明了索引顺序的重要性。
如果一个索引中包含查询所要的字段时,此时不需要再回表查询,我们就称该索引为覆盖索引。
比如下面的查询中,字段id是主键索引,所以可以直接返回索引的值,显著提升了查询的性能。
SELECT id FROM users WHERE id BETWEEN 10 AND 20;
当然,上面列出的只是索引的一小部分知识点,有什么回答不对的地方,欢迎指出。
以上是你需要掌握的13個MySQL索引知識點的詳細內容。更多資訊請關注PHP中文網其他相關文章!