秋招Day14 - MySQL - 索引

索引為什么能夠提高MySQL的查詢效率?

索引可以理解為目錄,通過索引可以快速定位數據,避免全表掃描

一般是B+樹結構,查找效率是O(log n)

索引還能加速排序、分組、連接等操作。

create index idx_name on students(name);

能簡單說一下索引的分類嗎?

功能上分,有主鍵索引、唯一索引、聯合索引、前綴索引和全文索引。

數據結構上分,有B+樹索引、哈希索引。

存儲內容上分,有聚簇索引、非聚簇索引。

你對主鍵索引了解多少?

主鍵索引用于唯一標識表中的每條記錄,其列值必須唯一且不為空。創建主鍵時會自動生成主鍵索引。

唯一索引和主鍵索引有什么區別?

主鍵索引 = 唯一索引 + 非空,每個表只能有一個主鍵索引,但是可以有多個唯一索引,唯一索引的列允許插入多個NULL值。

unique key和unique index有什么區別?

unique key是一種約束,創建唯一鍵時,MySQL會自動創建一個同名的唯一索引;反之,創建唯一索引也會隱式添加唯一性約束。

可通過 UNIQUE KEY uk_name 定義或者 CONSTRAINT uk_name UNIQUE 定義唯一鍵。

可通過 CREATE UNIQUE INDEX 創建唯一索引。

你對全文索引了解多少?

全文索引是一種優化文本數據檢索的特殊類型索引,適用于CHAR、VARCHAR、TEXT?

建表時可以通過FULLTEXT INDEX index_name (title, body) WITH PARSER ngram定義

ngram是一種解析器,可以處理中文日文韓文分詞

使用時用MATCH(title, content) AGAINST('+xxx -xxx' IN BOOLEAN MODE)

默認按降序返回結果,+標識必須包含,-表示必須排除,*表示通配符。

底層使用倒排索引將字段中的文本內容進行分詞,然后建立一個倒排表不是從文檔找詞匯,而是從詞匯找文檔

創建索引有哪些注意點?

第一、選擇合適的字段

  • 比如說頻繁出現在 WHERE、JOIN、ORDER BY、GROUP BY 中的字段。
  • 優先選擇區分度高的字段,比如用戶 ID、手機號等唯一值多的,而不是性別、狀態等區分度極低的字段,如果真的需要,可以考慮聯合索引

第二、要控制索引的數量,避免過度索引,比如說已經有聯合索引 (a, b),單索引(a)就是冗余的。每個索引都要占據存儲空間,建議單表的索引不超過五個。

第三、聯合索引使用時遵循最左前綴原則,定義時區分度高的字段優先于區分度低的字段,等值查詢的字段優先于范圍查詢的字段。

索引哪些情況下會失效?

索引列使用了函數、使用了通配符開頭的模糊查詢、聯合索引不滿足最左前綴原則、WHERE條件中使用or的時候部分字段無索引等

索引不適合哪些場景呢?

區分度低的列、頻繁更新的列(列更新代表索引也要更新)、數據量小

區分度 = 字段的唯一值數量 / 字段的總記錄數

索引是不是建的越多越好

不是,索引是會占用空間的,并且更新建了索引的字段的值也會同時更新索引,導致寫入變慢。在索引過多的情況下優化器也有可能選錯索引

說說索引優化的思路??

先通過慢查詢日志找出哪些SQL拖后腿,然后調用EXPLAIN查看執行計劃,看看是不是走了索引,是否回表、是否排序。然后根據字段特性設計合適的索引,如選擇區分度高的字段,使用聯合索引和覆蓋索引避免索引失效的寫法,最后通過實測來驗證優化效果。

為什么innodb要使用B+樹作為索引?

降低磁盤的I/O次數,支持有序遍歷范圍查找,因為索引本來就是有序的。

B+樹的每個節點都是一個頁,MySQL在磁盤中也是按頁存儲的。

B+樹的葉子節點構成了一個有序鏈表

哈希表不支持范圍查詢(無序),二叉樹太深,B樹所有節點都要存數據,所以使用B+樹

為什么MongoDB的索引采用B樹,而MySQL采用B+樹?

MongoDB通常以類似JSON形式存儲文檔,查詢的時候一般是使用單鍵等值。B樹既存儲key由存儲數據,這樣允許搜索的時候允許在非葉子節點提前終止,減少IO次數。

MySQL的查詢一般涉及范圍、排序、分組等操作。B+樹的葉子節點是雙向鏈表結構,無序回溯查找,直接通過葉子節點鏈表順序遍歷即可,天然具有有序性。

一顆B+樹能存多少條數據?

取決于樹的高度分支因子

(分支因子)^(樹高度-1) × 葉子節點容量

對于 2KW 條數據來說,B+樹的高度為 3 層就夠了。

為什么索引用B+樹而不用二叉樹?

因為二叉樹在按照順序從大到小插入時會退化成鏈表,樹的高度就是數據量,導致IO次數增多

平衡二叉樹雖然解決了退化成鏈表的問題,但是每個節點仍然只能有兩個分支,深度仍然很大。?

為什么使用B+樹而不是B樹?

第一,B 樹的每個節點既存儲鍵值,又存儲數據和指針,導致單節點存儲的鍵值數量較少

第二、B 樹的范圍查詢需要通過中序遍歷逐層回溯;而 B+ 樹的葉子節點通過雙向鏈表順序連接,范圍查詢只需定位起始點后順序遍歷鏈表即可,沒有回溯開銷。

第三,B 樹的數據可能存儲在任意節點,假如目標數據恰好位于根節點或上層節點,查詢僅需 1-2 次 I/O;但如果數據位于底層節點,則需多次 I/O,導致查詢時間波動較大。

B+ 樹的所有數據都存儲在葉子節點,查詢路徑的長度是固定的,時間穩定為 O(logN),對 MySQL 在高并發場景下的穩定性至關重要。

為什么使用B+樹而不使用跳表?

跳表本質上仍然是鏈表,假設每次向下都是二分查找,那么2000w條數據下,查找需要24次IO,因為2000w≈2^24,而B+樹最多只需要三次IO就夠了

B+樹的范圍查找怎么做的?

先通過索引路徑定位到第一個滿足條件的葉子節點,然后順著葉子節點之間的鏈表向右/向左掃描,直到超過范圍。

了解快排嗎?

用分治法將一個序列分割為較小和較大的兩個子序列,然后遞歸排序兩個字序列。

核心思想是選擇一個基準值,將數組分為兩個部分,左邊小于基準值,右邊大于等于基準值

B+樹索引和哈希索引有什么區別?

B+樹索引是一種平衡多路搜索樹,所有的數據都存在葉子節點上,非葉子節點只存儲key和頁面指針,葉子節點是有序的,支持范圍查找和有序遍歷和模糊查詢。

Hash索引是將鍵值映射到固定長度的哈希值,通過哈希值定位數據的位置,不支持有序遍歷和范圍查找,完全無序,只支持等值查詢,常見于Memory引擎。

聚簇索引和非聚簇索引有什么區別?

聚簇索引的葉子節點不僅存儲索引,還存儲了完整行數據,數據和索引是一起的InnoDB的主鍵索引就是聚簇索引。非聚簇索引的葉子節點存儲的是索引和對應聚簇索引的鍵值(主鍵值),需要回表非主鍵索引都是非聚簇索引,比如唯一索引,普通索引,全文索引,前綴索引,聯合索引。

如果使用非主鍵索引也不想回表,可以定義覆蓋索引,并在使用的時候遵循左前綴原則。

回表了解嗎?

使用非聚簇索引時,索引沒有覆蓋所需要查找的列,需要通過非聚簇索引的葉子節點找到對應的主鍵值,再利用主鍵值在聚簇索引中找到完整的行記錄,這個過程稱為回表。

回表的代價是什么?

回表需要訪問額外的數據頁,如果想要訪問的數據不在內存中,還需要從磁盤查找,增加IO開銷

可以通過聯合索引和覆蓋索引避免回表?

什么情況下會觸發回表?

查詢字段不在非聚簇索引的葉子節點的鍵值中時候,必須回到主鍵索引中獲取數據

查詢字段包含非索引列的時候,必然觸發回表

了解MRR嗎

MRR是為了避免大量回表引來的大量隨機IO問題引入的一種優化策略。

把非聚簇索引查到的主鍵值列表進行排序,再按順序去主鍵索引中批量回表,將隨機IO轉換為順序IO,減少磁盤尋道時間。

聯合索引了解嗎?

聯合索引就是把多個字段放在一個索引里,但必須遵守“最左前綴”原則,只有從第一個字段開始連續使用,索引才會生效。

聯合索引會根據字段的順序構造B+樹,比如定義了(age, name),會先根據age排序,age相同是再根據name排序,若兩者都相同則按照主鍵排序。

創建(A,B,C)聯合索引相當于同時創建了(A)(A,B)(A,B,C)三個索引。

聯合索引底層的存儲結構是什么樣的?

B+樹結構,每個節點都存儲了所有的索引列值作為key,并且按照定義時的順序排序。

非葉子節點存儲所有的索引列值,并且存儲了指向子節點的指針。

葉子節點存儲了所有索引列的值,并且存儲了對應的主鍵值

什么是最左前綴原則?

在聯合索引中,必須從最左邊的字段開始匹配,才能命中索引

范圍查詢后的列還能用作索引嗎?

不能,范圍查詢會中斷后面列的索引使用,因為索引是根據左前綴組織的,只有當左前綴的列值相同時,當前列值才有序。范圍查詢后,后續的字段不再有序

為什么不從最左邊開始查,就無法匹配呢?

因為聯合索引組織的時候就是按照最左邊的列進行排序的,最左邊的列相同后,再依次按照后面的列值進行排序。如果不從左邊開始查,無法判斷查找范圍

什么是索引下推?

沒有ICP的情況下,先在數據引擎層用索引查出來記錄,WHERE過濾是在服務層進行。ICP,是指把WHERE條件盡可能下推到索引掃描階段,在存儲引擎層提前過濾掉不符合條件的記錄,這樣可以減少回表次數

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

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

相關文章

第5天:LSTM預測火災溫度

🍨 本文為🔗365天深度學習訓練營 中的學習記錄博客🍖 原作者:K同學啊 目標 復用LSTM模型實現火災溫度預測 具體實現 (一)環境 語言環境:Python 3.10 編 譯 器: PyCharm 框 架: Pytorch &am…

目標檢測之YOLOV11自定義數據使用OBB訓練與驗證

一、前置條件與環境準備 在開始訓練前,確保已完成以下準備《目標檢測之YOLOV11自定義數據預處理——從原始標注到YOLO-OBB格式轉換與驗證》: 數據目錄結構: yolov11/ ├── datasets/ │ └── shrimp/ │ ├── images/ │ …

Labview教程進階一(Labview與OPC UA設備通信)

1.Labview與OPC UA設備通信 OPC UA通信協議優勢顯著,具體表現如下: 跨平臺兼容:支持多種操作系統和硬件平臺,實現無縫數據交換。高安全性:內置加密、身份驗證和授權機制,確保數據傳輸安全。高效數據交換:采用二進制編碼和優化的傳輸協議,提高通信效率。復雜數據建模:…

【Comsol教程】如何求解指定范圍的積分 或 在積分中去除奇異點/異常值

我們在Comsol中經常需要對物體的邊界求積分,比如求物體在流場中所受的總流體牽引力,又或者是物體在電場中受到的總介電泳力。當物體的材料或者邊界條件存在突變時,物體表面的粘性應力或者麥克斯韋電應力可能會存在異常值。通常解決方法有細化…

Python 多版本治理理念(Windows 平臺 · 零基礎友好)

🧠 Python 多版本治理理念(Windows 平臺 零基礎友好) 🌐 核心原則:三維治理、四級隔離、五項自治 以下是基于人工智能深度學習環境搭建實踐,總結出的"零基礎入門 Conda工具鏈 全隔離項目環境"…

Python文件管理利器之Shutil庫詳解

Shutil是一個Python內置的用來高效處理文件和目錄遷移任務的庫。Shutil不僅支持基本的文件復制、移動和刪除操作,還具備處理大文件、批量遷移目錄、以及跨平臺兼容性等特性。通過使用Shutil,我們可以更加輕松地實現文件系統的管理和維護,本文…

學習華為 ensp 的學習心得體會

引言? 在信息技術日新月異的今天,網絡技術作為連接世界的橋梁,其重要性不言而喻。作為一名對網絡技術充滿熱情的大一新生,我選擇了 eNSP(Enterprise Network Simulation Platform,企業網絡模擬平臺)作為我…

jenkins-2.439.1搭建

一、 二、pipeline文件 pipeline { agent any // 可以指定特定的agent, 如 label 或 docker environment { JAVA_HOME "/usr/local/software/jdk1.8.0_451" PATH "${JAVA_HOME}/bin:${env.PATH}" } tools { …

【threejs】一天一個小案例講解:控制面板(GUI)

# 好吧,每天更新實在有點艱巨,我盡量少量多次 代碼倉 所有代碼都會上傳到這里,可自行clone GitHub - TiffanyHoo/three_practices: Learning three.js together! 運行效果圖 ? 知識要點 一、安裝dat.gui npm i dat.gui 二、使用步驟&a…

飛輪儲能輔助雙饋風機參與電力系統一次調頻的仿真模型研究

以下是一篇關于飛輪儲能輔助雙饋風機參與電力系統一次調頻的仿真模型研究的論文 ,涵蓋理論分析、數學模型構建、控制策略設計及仿真驗證等內容,適用于電氣工程、新能源技術等領域的研究參考。 飛輪儲能輔助雙饋風機參與電力系統一次調頻的仿真模型研究 摘要 隨著風電在電力…

一次性理解Java垃圾回收--簡單直接方便面試時使用

Java的垃圾回收是一個面試必問題,只要按照下面的步驟回答肯定不會有大問題。 1.先告訴面試官垃圾回收分為兩大步: a.識別哪些對象是"垃圾"(不再被使用的對象) b.回收這些垃圾對象占用的內存空間 2. 接下來分別介紹標記階段和回收階段的細節…

XML映射文件-輔助配置

如果你沒有按照同包同名來,就要下面的配置,指定好路徑 1.把路徑改為類下面的xml文件 #指定xml映射文件的位置 mybatis.mapper-locationsclasspath:mapper/*.xml

120、三角形最小路徑和

題目 解答: 直接按照空間復雜度O(n)來做了。這種明顯是動態規劃,每一層用到上一層的信息。 觀察數據形狀,如下: (0,0) (1,0)(1,1) (2,0)(2,1)(2,2) (3,0)(3,1)(3,2)(3,3) ... (n-1,0)...(n-1,n-1) 設dp[n],定義為本層第n…

仕么是Transformer以及工作原理和架構

Transformer 是一種革命性的**深度學習架構**,由 Google 團隊在 2017 年論文《Attention is All You Need》中提出。它徹底改變了自然語言處理(NLP)領域,并逐漸擴展到計算機視覺、語音識別等多模態任務。其核心創新在于**完全依賴…

opencv 鎖頁內存的使用

在OpenCV的CUDA編程中,cv::cuda::HostMem類用于管理鎖頁內存(Page-Locked Memory)?,這種內存能顯著提升主機(CPU)與設備(GPU)間的數據傳輸效率。而.createMatHeader()正是將HostMem…

亞遠景-ASPICE與ISO 26262:理解汽車軟件質量保障的雙標體系

在汽車行業向智能化、電動化轉型的背景下,ASPICE(Automotive SPICE)與ISO 26262作為汽車軟件質量保障的兩大核心標準,分別從過程能力與功能安全兩個維度構建了完整的開發管理體系。以下從標準定位、核心差異、協同實踐及行業價值四…

數組的應用

Java數組的基本概念 數組是Java中一種重要的數據結構,用于存儲固定大小的相同類型元素。數組在內存中連續分配空間,可以通過索引快速訪問元素。數組的聲明和初始化是使用數組的基礎,聲明時需要指定數據類型和數組名稱,初始化可以…

基礎RAG實現,最佳入門選擇(七)

增強型RAG系統的查詢轉換 采用三種查詢轉換技術,以提高RAG系統中的檢索性能,而無需依賴于像LangChain這樣的專門庫。通過修改用戶查詢,我們可以顯著提高檢索信息的相關性和全面性。 關鍵轉換技術 1.查詢重寫:使查詢更加具體和詳…

企業應用觀測中樞建設

本文來自騰訊藍鯨智云社區用戶: CanWay 運維挑戰加劇 新時代技術背景下,運維面臨的挑戰加劇: 1、業務數量日益增加、業務規模日益龐大 隨著科技發展進步、民眾生活富足,線下業務線上化、線上業務復雜化趨勢愈演愈烈,各行各業投…

Python實例題:基于邊緣計算的智能物聯網系統

目錄 Python實例題 題目 問題描述 解題思路 關鍵代碼框架 難點分析 擴展方向 Python實例題 題目 基于邊緣計算的智能物聯網系統 問題描述 開發一個基于邊緣計算的智能物聯網系統,包含以下功能: 邊緣設備管理:連接和管理大量物聯網…