面試八股之MySQL篇2——索引篇

?🌈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!!!
📚愿大家都能學有所得,功不唐捐!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/14075.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/14075.shtml
英文地址,請注明出處:http://en.pswp.cn/web/14075.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Springboot階段項目---《書城項目》

一 項目介紹 本項目采用集成開發平臺IntelliJ IDEA開發了在線作業成績統計系統的設計與實現,實現了圖書商城系統的綜合功能和圖形界面的顯示,可以根據每個用戶登錄系統后,動態展示書城首頁圖書,實現了分類還有分頁查詢&#xff0c…

進程、線程——面經(一)

1、什么是進程(Process),線程(Thread),有什么區別? 進程(Process): 定義: 進程是一個獨立的執行環境,它擁有獨立的內存空間&#xf…

Linux應用入門(二)

1. 輸入系統應用編程 1.1 輸入系統介紹 常見的輸入設備有鍵盤、鼠標、遙控桿、書寫板、觸摸屏等。用戶經過這些輸入設備與Linux系統進行數據交換。這些設備種類繁多,如何去統一它們的接口,Linux為了統一管理這些輸入設備實現了一套能兼容所有輸入設備的…

怎么壓縮pdf pdf在線壓縮 pdf文件壓縮大小

pdf文件無論在何種設備上打開,PDF文件都能保持其原始的布局和格式,這對于文檔共享和打印非常重要。PDF不僅支持文本,還能嵌入圖像、視頻、音頻以及動態鏈接等元素。PDF文件支持加密和密碼保護,可以限制訪問、編輯、復制或打印文檔…

C語言----深入理解指針(3)

1.字符指針變量 //int main() //{ // char ch w; // char*pc&ch; // printf("%c", *pc); // return 0; //}/*int main() {//char* p "abcdef";//char arr[] "abcdef";//常量字符串 a b c d e f \0//char* pc arr;//將數組首…

高防IP是什么意思?

在網絡安全中,企業和用戶經常會受到網絡攻擊和流量攻擊,比如DDOS攻擊和CC攻擊等,那么對于這些網絡攻擊,企業和用戶有什么解決方案呢? 對于網絡攻擊,高防IP是一種針對網絡攻擊和分布式拒絕服務攻擊設計的IP解…

【002】FlexBison原理分析

0. 前言 Flex和Bison是用于構建處理結構化輸入的程序的工具。它們最初是用于構建編譯器的工具,但它們已被證明在許多其他領域都很有用。  在第一章中,我們將首先看一點(但不是太多)它們背后的理論,然后我們將深入研究一些使用它…

K8S認證|CKA題庫+答案| 5. 創建 Ingress

5 . 創建 Ingress 您必須在以下Cluster/Node上完成此考題: Cluster Master node Worker node k8s master …

基于Tensorflow卷積神經網絡垃圾智能分類系統

歡迎大家點贊、收藏、關注、評論啦 ,由于篇幅有限,只展示了部分核心代碼。 文章目錄 一項目簡介 二、功能三、系統四. 總結 一項目簡介 一、項目背景與意義 隨著城市化進程的加速,垃圾問題日益嚴重,垃圾分類成為解決這一問題的關…

淺談金融行業數據安全分類分級

數據安全管理是一項從上而下的、多方配合開展的工作。在進行數據安全管理組織架構建設時,需要從上而下建設;從而全面推動數據安全管理工作的執行和落地;以保證數據安全的合法合規、并長效推動業務的發展和穩定運行。 金融行業機構應設立數據…

「項目」負載均衡在線OJ(ONLINE_JUDGE)系統

🐶博主主頁:??. 一懷明月? ???🔥專欄系列:線性代數,C初學者入門訓練,題解C,C的使用文章,「初學」C,linux 🔥座右銘:“不要等到什么都沒有了…

機器學習系列--強化學習

強化學習(Reinforcement Learning,RL)是一種機器學習方法,旨在通過智能體(Agent)在環境(Environment)中采取行動(Actions)并獲取反饋(Reward&…

技術驅動未來,全面揭秘 Sui 的生態發展和布局

在不到一年的時間里,由 Mysten Labs 團隊創立的 Layer1 區塊鏈 Sui 迅速崛起,成功躍升至去中心化金融(DeFi)的前十名。根據 DeFi Llama 的數據,Sui的總鎖定價值(TVL)在短短四個月內增長超過 100…

13-云原生監控體系-Mysqld_exporter 監控 MySQL[部署Dashborad告警規則實戰]

文章目錄 1. 部署1.1. 二進制方式部署1.1.1. 下載1.1.2. 部署1.1.3. MySQL 服務的配置1.2 docker-compose 方式1.3 配置 Prometheus1.4 測試1.5 mysqld_exporter 命令行運行參數1.5.1. 配置格式1.5.2. 運行參數詳解1.5.3. 監控不同的集群2. Dashboard2.

【好玩的經典游戲】Docker環境下部署retroarch-web經典游戲模擬器

【好玩的經典游戲】Docker環境下部署retroarch-web經典游戲模擬器 前言一、RetroArch-web介紹二、本地環境介紹2.1 本地環境規劃2.2 本次實踐介紹三、檢查本地環境3.1 檢查系統版本3.2 檢查Docker服務狀態四、拉取鏡像五、創建retroarch-web容器5.1 創建容器5.2 查看容器狀態六…

深度學習之基于Tensorflow+Flask框架Web手寫數字識別

歡迎大家點贊、收藏、關注、評論啦 ,由于篇幅有限,只展示了部分核心代碼。 文章目錄 一項目簡介 二、功能三、系統四. 總結 一項目簡介 一、項目背景與意義 手寫數字識別是深度學習領域中的一個經典問題,也是計算機視覺領域的重要應用之一。…

BFT Robotics - 您的智能自動化伙伴

“買機器人,上BFT” 自動化和機器人技術是推動現代工業發展的重要力量。BFT Robotics以其創新的產品系列和定制化解決方案,為企業提供了一條通往高效、智能生產環境的道路。通過采用BFT Robotics的產品和服務,企業不僅能夠提高生產效率&#…

編程語言的集合判斷邏輯

當判斷一個Item是否在集合中,比如List,Map,Array等,只可以判斷真,不可以判斷假。 如果執著判斷,也可以通過設置標志位去實現,這樣代碼就會顯得臃腫,效率低下。 比如 list.forEach…

js JSON.stringify 對象轉字符串

通過 JSON.stringify() 把 JavaScript 對象轉換為字符串 注: 在 JSON 中,不允許日期對象。JSON.stringify() 函數將把任何日期轉換為字符串。在 JSON 中,不允許函數作為對象值。 JSON.stringify() 函數將從 JavaScript 對象刪除任何函數&am…