?🌈hello,你好鴨,我是Ethan,一名不斷學習的碼農,很高興你能來閱讀。
??目前博客主要更新Java系列、項目案例、計算機必學四件套等。
🏃人生之義,在于追求,不在成敗,勤通大道。加油呀!
🔥個人主頁:Ethan Yankang
🔥專欄:MySQL||Java八股文
🔥本篇概覽:有關MySQL的索引知識
目錄
?1、數據結構對比
(1)B tree
(2)B+ tree
(3)總結
2、聚簇索引與非聚簇索引
(1)什么是聚簇索引和非聚簇索引?
(2)回表查詢
3、覆蓋索引
(1)超大分頁問題
(2)創建覆蓋索引
(3)總結
?4、索引創建原則
(1)總結
(2)補充:聯合索引
5、什么情況下索引會失效
(1)違反最左前綴法則
(2)范圍查詢右邊的列,不能使用索引
(3)不要在索引列上進行運算操作,索引將失效
(4)字符串不加單引號,造成索引失效。(類型轉換)
(5)以%開頭的Like模糊查詢,索引失效
總結
?1、數據結構對比
(1)B tree
(2)B+ tree
B+Tree是在BTree基礎上的一種優化,使其更適合實現外存儲索引結構,InnoDB存儲引擎就是用B+Tree實現其索引結構
?
(3)總結
2、聚簇索引與非聚簇索引
(1)什么是聚簇索引和非聚簇索引?
聚簇索引主要是指數據與索引放到一塊,B+樹的葉子節點保存了整行數據,主鍵在作為聚簇索引的有且只有一個。
非聚簇索引值指的是數據與索引分開存儲,B+樹的葉子節點保存對應的主鍵,可以有多個,一般我們自己定義的索引都是非聚簇索引。
(2)回表查詢
回表的意思就是通過二級索引找到對應的鍵值,然后再通過主鍵值找到聚集索引中所對應的整行數據,這個過程就是回表。
3、覆蓋索引
覆蓋索引是指查詢使用了索引,并且需要返回的列,在該索引中已經全部能夠找到
(1)超大分頁問題
超大分頁一般都是在數據量比較大時,我們使用了limit分頁查詢,并且需要對數據進行排序,這個時候效率就很低,我們可以采用覆蓋索引和子查詢來解決
先分頁查詢數據的id字段,確定了id之后,再用子查詢來過濾,只查詢這個id列表中的數據就可以了
因為查詢id的時候,走的覆蓋索引,所以效率可以提升很多。
以下是一個覆蓋索引的具體例子: 假設有一個表 `students` ,包含字段 `id`(主鍵)、`name`、`age`。 創建了一個索引 `idx_name_age` 包含 `name` 和 `age` 字段。 現在有一個查詢: `SELECT name, age FROM students WHERE name = '張三'` 。 在這個查詢中,通過索引 `idx_name_age` 就可以直接獲取到滿足條件的 `name` 和 `age` 信息,而無需再去查找表中的數據行,這就是覆蓋索引發揮作用了。因為查詢所需要的列都在索引中直接找到了,避免了回表操作,提高了查詢效率。
(2)創建覆蓋索引
要創建覆蓋索引,可以按照以下步驟進行:
1. **確定需要創建索引的表和字段**:
確定要在哪個表上創建索引,以及要包含在索引中的字段。
2. **使用`CREATE INDEX`語句**:
使用`CREATE INDEX`語句來創建索引。
例如,如果要在表`students`的`name`和`age`字段上創建索引,可以使用以下語句: ```sql CREATE INDEX idx_name_age ON students (name, age); ``` 在上述語句中,`idx_name_age`是索引的名稱,可以根據需要自定義。`students`是要創建索引的表名,`(name, age)`是要包含在索引中的字段列表。 創建覆蓋索引后,在查詢中使用到這些索引字段時,數據庫可以直接從索引中獲取數據,而無需再進行回表操作,從而提高查詢效率。
(3)總結
覆蓋索引是指select查詢語句使用了索引,在返回的列,必須在索引中全部能夠找到,如果我們使用id查詢,它性能高。會直接走聚集索引查詢,一次索引掃描,直接返回數據?
如果按照二級索引查詢數據的時候,返回的列中沒有創建索引,有可能會觸發回表查詢,盡量避免使用select*。
——————————————————
盡量在返回的列中都包含添加索引的字段
?4、索引創建原則
?
(1)總結
大頻、查詢、聯合、控制
(2)補充:聯合索引
5、什么情況下索引會失效
(1)違反最左前綴法則
在 MySQL 中,當使用聯合索引時,如果查詢條件沒有遵循最左前綴法則,可能會導致索引無法被充分利用或完全不能使用索引。
最左前綴法則是指在查詢中要按照聯合索引中字段的順序依次使用條件。
例如,有一個聯合索引 `(col1, col2, col3)`,如果查詢條件中只使用了 `col3` 而沒有使用 `col1` 和 `col2` ,或者使用 `col2` 和 `col3` 而沒有 `col1` ,就違反了最左前綴法則,此時索引可能就不能發揮最佳效果或無法使用索引。
以下是一些違反最左前綴法則的常見情況示例:
```sql
-- 只使用了 col3,違反最左前綴法則 SELECT * FROM table WHERE col3 = 'value';
-- 先使用 col2 再使用 col1,順序錯誤,違反最左前綴法則 SELECT * FROM table WHERE col2 = 'value' AND col1 = 'value';
```
(2)范圍查詢右邊的列,不能使用索引
(3)不要在索引列上進行運算操作,索引將失效
(4)字符串不加單引號,造成索引失效。(類型轉換)
(5)以%開頭的Like模糊查詢,索引失效
總結
📣非常感謝你閱讀到這里,如果這篇文章對你有幫助,希望能留下你的點贊👍 關注? 分享👥 留言💬thanks!!!
📚愿大家都能學有所得,功不唐捐!