【MySQL】前綴索引、索引下推、訪問方法,自適應哈希索引

最左前綴原則

  • 對于INDEX(name, age)來說
  • 最左前綴可以是聯合索引最左N個字段, 也可以是字符串索引最左M個字符
 SELECT * FROM t WHERE name LIKE '張%'
  • 其效果和單獨創建一個INDEX(name)的效果是一樣的
  • 若通過調整索引字段的順序, 可以少維護一個索引樹, 那么這個順序就是需要優先考慮采用
  • 字符串創建索引,要考慮如果字符串很長的情況下,那么維護和響應成本也會很高,這時,可以使用字符串最左邊開始部分字符建立索引
  • 索引的選擇性指的是 : 不重復的索引值和數據表的記錄總數(#T)的比值, 范圍為 1/#T 到 1 之間, 索引選擇性查詢效率

索引選擇性 = 不重復值的數量 / 總記錄數,它反映了“這個索引字段能不能把數據查得很精”。

如果一個字段有 10 萬條記錄,但只有 3 個不同的值(比如性別:男、女,武裝直升機),選擇性 = 3 / 100000 = 0.00003 → 很低,不推薦建立單獨索引。

如果字段有 10 萬條記錄,幾乎每條都不同(比如身份證號),選擇性接近 1 → 非常高,適合做索引。

  • 為什么選擇性越高,查詢越快?
    • 因為選擇性越高,能過濾掉的數據就越多,減少回表,查詢效率就越高。
  • 對于BLOB, TEXT, VARCHAR等類型的列, 必須使用前綴索引, MySQL不允許索引這些列的完整長度
  • MySQL 不允許直接為這類大字段建完整索引(因為太大了)。所以要建前綴索引,也就是只索引字段前 N 個字符

如何選 N(前綴長度)?

  1. 先看整列的區分度(理想情況):

    SELECT COUNT(DISTINCT name)/COUNT(*) FROM t;
    
  2. 再試試不同前綴長度的選擇性,比如前 3、5、10 個字符:

    SELECT COUNT(DISTINCT LEFT(name, 3))/COUNT(*) FROM t;
    SELECT COUNT(DISTINCT LEFT(name, 5))/COUNT(*) FROM t;
    ...
    
  3. 看哪個N更靠近1, 進行索引的創建,用它來建索引:

    CREATE INDEX idx_name_prefix ON t(name(N));
    
-- 查看詳細索引信息
show index from products;

什么是“索引下推”?

索引下推是 MySQL 從 5.6 開始引入的一種優化技術,它讓更多的WHERE 條件在索引掃描階段就被處理掉,減少了回表次數,從而提升查詢效率。


舉個例子說明:

SQL語句如下:

SELECT * FROM t WHERE name LIKE '陳%' AND age = 10;
-- 假設我們創建了聯合索引:INDEX(name, age)

在 MySQL 5.6 之前(沒有索引下推):

  1. 使用索引找出 name LIKE '陳%' 匹配的主鍵 id
  2. 對這些 id 一條條回表(到原始數據)
  3. 然后在回表的數據中判斷 age = 10

問題:大量回表,浪費IO。


MySQL 5.6 之后(有索引下推 ICP):

  1. 先用索引查出 name LIKE '陳%'
  2. 在索引中繼續判斷 age = 10(因為索引中也有 age 字段)。
  3. 只有兩個條件都滿足,才回表拿全部字段。

優勢:回表次數少,速度快。


對比圖解(簡化描述):

[無 ICP]       name → (回表) → 判斷 age → 符合 → 返回結果
[有 ICP]       name → 判斷 age (在索引內完成) → (回表) → 返回結果

使用條件:

  • 使用了聯合索引(如 INDEX(name, age))。
  • 查詢中涉及多個字段條件。
  • 被篩選的多個字段都在索引中存在

想驗證是否用了索引下推?

你可以使用 EXPLAINEXPLAIN FORMAT=JSON

EXPLAIN SELECT name, age FROM t WHERE name LIKE '陳%' AND age = 10;

查看 Extra 中是否出現:

Using index condition

就說明用了索引下推。

索引下推使用條件逐條理解

條件含義解釋是否關鍵原因與說明
? 只能用于 rangerefeq_refref_or_null 訪問方法ICP 只在索引訪問的情況下生效,這幾種是索引訪問方式中常見的全表掃描 (ALL) 不會使用索引,自然也就無索引下推
? 只能用于 InnoDB 和 MyISAM 引擎(含分區表)目前 ICP 僅支持這兩個存儲引擎其他引擎如 MEMORY、CSV 不支持該特性
? 對 InnoDB 來說,ICP 只作用于 二級索引(輔助索引)InnoDB 的主鍵是聚簇索引,數據和索引一體聚簇索引查詢不需要回表,因此沒有回表優化的必要
? ICP 的目的就是減少回表次數(減少 IO)回表代價高,所以想辦法讓更多的過濾發生在索引層回表越少,磁盤 IO 越少,性能越高
? 子查詢中的條件不能下推ICP 只作用于主查詢中的 WHERE 條件子查詢優化路徑不同,不能在索引層提前判斷
? 使用存儲函數(如 IFNULL(col, ''))的條件不能下推存儲引擎無法理解和執行存儲函數ICP 是存儲引擎層做的過濾,函數是 SQL 層的,隔離了

什么是這些“訪問方法”?(range、ref、eq_ref、ref_or_null)

這些是 MySQL 優化器 在執行 SELECT 時使用的 索引訪問方式,用來決定“怎么查你這張表”。

你可以用 EXPLAIN 看見,比如:

EXPLAIN SELECT * FROM users WHERE id = 1;

type 那一列就可能會出現:refrangeALL 等。


訪問方法中文意思舉例是否能用 ICP說明
range范圍查找id > 5 AND id < 10? 支持利用索引范圍掃描(B+ 樹區間)
ref普通等值查找name = '張三'name 有索引? 支持單值等值匹配,常見聯合索引匹配場景
eq_ref唯一等值查找t1.id = t2.id 且 t2.id 是主鍵或唯一索引? 支持用于連接,精確匹配唯一值
ref_or_null等值 + null 查找name = '張三' OR name IS NULL? 支持對空值的處理也是索引可識別的
ALL全表掃描沒有用索引? 不支持沒有用到索引,自然談不上索引下推
  • 嘗試時的一個問題
create index idx_product_name_and_category_union on products(product_name, category);
show index from products;
-- 這里沒觸發索引下推,LIKE '筆%' 是可以使用索引的(前綴匹配),
-- 但匹配度低,MySQL 可能選擇不下推 category 的判斷,保留到回表階段處理。
explain select product_id from products where product_name like '筆%' and category = 'Electronics';-- 加上 FORCE INDEX 強制使用聯合索引,后就使用索引下推了
EXPLAIN SELECT * FROM products FORCE INDEX(idx_product_name_and_category_union)
WHERE product_name LIKE '筆%' AND category = 'Electronics';

在這里插入圖片描述


自適應哈希索引

InnoDB 支持一種 自適應哈希索引(AHI) 的優化機制,它不是我們手動建的索引,而是 InnoDB 在運行過程中自動創建的哈希索引

  • 目的是加快查詢速度,特別是對頻繁訪問的相同范圍或相同條件的 B+樹索引查詢,會自動轉化為哈希結構,提升效率。

具體來說:

  • InnoDB 會監控 B+ 樹索引的使用頻率
  • 如果發現某段范圍經常被查詢,而且是“等值查找”(不是模糊、范圍),就會自動為這段建立哈希索引
  • 這樣后續的查找可以從 O(log n) 變為 O(1),提升性能
  • 它是完全自動、由 InnoDB 維護的,不需要我們手動干預

內容
使用場景頻繁的等值查詢,例如 WHERE id = 123,會被自動轉換為哈希索引優化
控制開關參數:innodb_adaptive_hash_index=ON(默認開啟)
內存占用哈希索引是存在 Buffer Pool 的內存中,不是磁盤上的
限制只能用于等值匹配,不支持范圍查詢或模糊匹配(LIKE、BETWEEN 等)
風險對熱點表、高并發寫可能帶來鎖沖突,可考慮關閉該功能

https://github.com/0voice

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

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

相關文章

【Oracle專欄】Oracle中的虛擬列

Oracle相關文檔&#xff0c;希望互相學習&#xff0c;共同進步 風123456789&#xff5e;-CSDN博客 1.背景 在EXP方式導出時&#xff0c;發現 出現如下提示 EXP-00107: virtual column 不支持&#xff0c;因此采用expdp方式導出。于是本文針對oracle虛擬列進行簡單介紹。 2. 相…

Nacos深度剖析與實踐應用之-配置中心

&#x1f4f9; 簡介 在微服務架構中&#xff0c;配置管理是至關重要的基礎能力。Nacos作為阿里巴巴開源的一體化動態服務發現、配置管理和服務管理平臺&#xff0c;其配置中心模塊提供了統一配置管理、動態配置推送、多環境支持等核心能力。相比傳統配置文件方式&#xff0c;Na…

gma 2.1.4 (2025.04.18) | GmaGIS V0.0.1a3 更新日志

安裝 gma 2.1.4 pip install gma2.1.4網盤下載&#xff1a; 鏈接&#xff1a;https://pan.baidu.com/s/1P0nmZUPMJaPEmYgixoL2QQ?pwd1pc8 提取碼&#xff1a;1pc8 注意&#xff1a;此版本沒有Linux版&#xff01; 編譯gma的Linux虛擬機沒有時間修復&#xff0c;本期Linux版繼…

在 Node.js 中設置響應的 MIME 類型

在 Node.js 中設置響應的 MIME 類型是為了讓瀏覽器正確解析服務器返回的內容&#xff0c;比如 HTML、CSS、圖片、JSON 等。我們通常通過設置響應頭中的 Content-Type 字段來完成。 ? 一、什么是 MIME 類型&#xff08;Content-Type&#xff09;&#xff1f; MIME&#xff08;…

SRS transcode支持 h264_nvenc 硬件解碼方案

文章目錄 SRS transcode支持 h264_nvenc 硬件解碼方案1、修改文件2、重新編譯3、使用 SRS transcode支持 h264_nvenc 硬件解碼方案 SRS 是開源的流媒體服務&#xff0c;但在使用 GPU 服務器時&#xff0c;想要通過硬件加速&#xff0c;目前官方是不支持的&#xff0c;所以簡單…

數字系統與編碼

1. 數字系統&#xff08;Number Systems&#xff09; 1.1 常見數字系統 系統基數符號集示例應用場景二進制20, 11010計算機底層電路、數據存儲八進制80-717Unix文件權限&#xff08;如chmod 755&#xff09;十進制100-942日常計算十六進制160-9, A-F0x1F內存地址、顏色編碼&a…

【PyTorch】訓練時跟OOM相關的提示信息

1. RuntimeError: CUDA error: CUBLAS_STATUS_NOT_INITIALIZED when calling cublasCreate(handle)

基于maven-jar-plugin打造一款自動識別主類的maven打包插件

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家&#xff0c;歷代文學網&#xff08;PC端可以訪問&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移動端可微信小程序搜索“歷代文學”&#xff09;總架構師&#xff0c;15年工作經驗&#xff0c;精通Java編…

多態的主要好處與不足

多態是面向對象編程的核心特性之一&#xff0c;它通過方法重寫、接口實現等方式實現“同一操作作用于不同對象時產生不同行為”。以下是多態的主要好處與不足&#xff1a; 多態的好處 1. 提高代碼靈活性和擴展性 開閉原則支持&#xff1a;新增子類時&#xff0c;無需修改現有…

excel解析圖片pdf附件不怕

背景 工作中肯定會有導入excel還附帶圖片附件的下面是我解析的excel&#xff0c;支持圖片、pdf、壓縮文件實現 依次去解析excel&#xff0c;看看也沒有附件&#xff0c;返回的格式是Map&#xff0c;key是第幾行&#xff0c;value是附件list附件格式都被解析成pdf格式Reader.jav…

python爬蟲 線程,進程,協程

0x00 線程 線程是一個執行單位&#xff0c;是在一個進程里面的&#xff0c;是共享進程里面的提供的內存等資源&#xff0c;使用多個線程時和使用多個進程相比&#xff0c;多個線程使用的內存等資源較少。進程像一座“房子”&#xff08;獨立資源&#xff09;&#xff0c;線程是…

ES|QL,知道嗎,專為搜索而生 —— 推出評分和語義搜索

作者&#xff1a;來自 Elastic Ioana Tagirta 在 Elasticsearch 8.18 和 9.0 中&#xff0c;ES|QL 支持評分、語義搜索以及更多的 match 函數配置選項&#xff0c;還有一個新的 KQL 函數。 使用 ES|QL 搜索 在 Elasticsearch 8.18 和 9.0 中&#xff0c;ES|QL 增加了一系列新功…

MIT6.S081-lab4

MIT6.S081-lab4 注&#xff1a;本篇lab的前置知識在《MIT6.S081-lab3前置》 1. RISC-V assembly 第一個問題 Which registers contain arguments to functions? For example, which register holds 13 in main’s call to printf? 我們先來看看main干了什么&#xff1a; …

一文總結通信電路中LC諧振回路中各公式以及對深入解讀品質因數Q

目錄 前言 一、基本公式總結 1.并聯諧振回路 2.串聯諧振回路 二、淺談品質因數 1.衡量諧振回路能量存儲與能量損耗之比的無量綱參數&#xff0c;用于描述諧振電路的頻率選擇性 2.當受到振蕩驅動力時&#xff0c;諧振腔的中心頻率與其帶寬的比值 3.為什么諧振時電容上的…

Linux:文件系統

一.認識硬件–磁盤 1. 物理結構 1.2 存儲結構 ?如何定位?個扇區呢&#xff1f; 可以先定位磁頭&#xff08;header&#xff09;——》確定磁頭要訪問哪?個柱?(磁道)&#xff08;cylinder&#xff09;——》 定位?個扇區(sector)。 柱?&#xff08;cylinder&#xff09…

數字孿生廢氣處理工藝流程

圖撲數字孿生廢氣處理工藝流程系統。通過精準 3D 建模&#xff0c;對廢氣收集、預處理、凈化、排放等全流程進行 1:1 數字化復刻&#xff0c;實時呈現設備運行參數、污染物濃度變化等關鍵數據。 借助圖撲可視化界面&#xff0c;管理者可直觀掌握廢氣處理各環節狀態&#xff0c…

Scratch——第18課 列表接龍問題

在四級的考級中&#xff0c;接龍的題目雖然在CIE中只出現過兩次&#xff0c;但是這類題目對字符串的知識點考察相對全面。 一、接龍游戲的判斷方法 接龍的內容對應的字符數 ? 已接龍內容的字符數 滿足條件>接龍內容的第一個字符數 ? 上一項接龍的最后一個字符 滿足條件…

webgl入門實例-向量在圖形學中的核心作用

在圖形學中&#xff0c;向量是描述幾何、光照、運動等核心概念的基礎工具。以下是向量在圖形學中的關鍵應用和深入解析&#xff1a; 1. 向量的核心作用 幾何表示&#xff1a;描述點、方向、法線、切線等。空間變換&#xff1a;平移、旋轉、縮放等操作依賴向量運算。光照計算&a…

Redis 是如何保證線程安全的?

Redis 是如何保證線程安全的&#xff1f; Redis 是一個高性能的鍵值數據庫&#xff0c;廣泛應用于緩存、消息隊列、實時分析等場景。由于其性能優勢&#xff0c;Redis 已經成為許多系統的核心組件之一。然而&#xff0c;很多開發者在使用 Redis 時&#xff0c;常常會問&#x…

Img2img-turbo 在2080Ti上的測試筆記

1. 介紹 [img2img-turbo]是[pytorch-CycleGAN-and-pix2pix]推薦的更新的圖像變換的代碼實現&#xff1b; 2. 配置信息 Conda環境名稱&#xff1a;img2img-turbo 3. 問題描述 當前在我們嘗試使用了官方推薦的訓練命令在2080Ti上進行訓練&#xff0c; 3.1 出現了 CUDA out …