MySQL強化關鍵_019_索引優化

目? 錄

一、最左前綴原則

1.完全使用索引?

2.部分使用索引

3.不使用索引

4.效率折損

(1)使用范圍查找

(2)索引斷開

?二、索引失效場景

1.?索引列參與運算

2.索引列模糊查詢以“%”開始

3.索引列是字符串類型,查詢省略單引號

4.查詢條件包含“or”,其中有未添加索引的字段?

5.查詢符合條件的記錄在表中占比較大

三、指定索引

?四、覆蓋索引

1.說明

2.實例

五、前綴索引

六、單列索引與復合索引的選擇

七、創建索引的原則


一、最左前綴原則

# 初始化
drop table if exists t_customer;
create table t_customer(id int primary key auto_increment,name varchar(10),age int,gender char(2),email varchar(20)
);
insert into t_customer(name, age, gender, email) values('劉林', 21, '女', '2238953721@999.com'),('王剛', 23, '男', '1477123899@999.com'),('趙輝', 19, '男', '3287654466@999.com'),('何鈺', 20, '女', '7981112520@999.com'),('周洋', 27, '男', '6287553412@999.com');create index index_tcustomer_nag on t_customer(name, age, gender);show index from t_customer;

? ? ? ? ?若要索引生效,必須遵循最左前綴原則。即上述為 t_customer 創建了name,age,gender 聯合索引,添加順序如此。則在進行查詢時,如果 where 條件中沒有 name 字段參與,則復合索引失效。

? ? ? ??條件中必須要有最左側字段參與,這樣復合索引才會生效。最具有唯一性的字段應該放在最左側。


1.完全使用索引?

explain select * from t_customer where name = '何鈺' and age = 20 and gender = '女';


2.部分使用索引

explain select * from t_customer where name = '何鈺' and age = 20;explain select * from t_customer where name = '何鈺';explain select * from t_customer where name = '何鈺' and gender = '女';


3.不使用索引

explain select * from t_customer where age = 20 and gender = '女';


4.效率折損

(1)使用范圍查找

? ? ? ? 使用了范圍查找,若范圍條件不添加等號,則范圍條件右側列不會使用索引。

? ? ? ? 如下實例,從【key_len】字段可以看出:第一條【gender】字段沒有使用索引。而第二條完全使用了索引。

explain select * from t_customer where name = '何鈺' and age > 20 and gender = '女';explain select * from t_customer where name = '何鈺' and age >= 20 and gender = '女';


(2)索引斷開

? ? ? ? 條件中使用了索引最左側字段,但是沒有使用索引中的全部字段且間斷使用,會使間斷的字段不使用索引。

? ? ? ? 如下方第一條,條件中沒有使用【age】字段,而導致間斷,所以【gender】字段沒有使用索引。而第二條完全使用了索引。


?二、索引失效場景

# 初始化
drop table if exists t_emp;
create table t_emp(id int primary key auto_increment,name varchar(10),sal int,age char(2)
);
insert into t_emp(name, sal, age) values('劉強', 6000, 37),('川建國', 2000, 53),('郭珊珊', 9000, 27);create index index_temp_name on t_emp(name);
create index index_temp_sal on t_emp(sal);
create index index_temp_age on t_emp(age);show index from t_emp;


1.?索引列參與運算

explain select * from t_emp where sal * 10 > 50000;


2.索引列模糊查詢以“%”開始

explain select * from t_emp where name like '%珊珊';


3.索引列是字符串類型,查詢省略單引號

explain select * from t_mep where name = 郭珊珊;


4.查詢條件包含“or”,其中有未添加索引的字段?

-- 查看執行計劃
explain select * from t_emp where age = '53' or sal = 2000;-- 刪除sal索引
alter table t_emp drop index index_temp_sal;-- 查看執行計劃
explain select * from t_emp where age = '53' or sal = 2000;


5.查詢符合條件的記錄在表中占比較大

# 新插入幾條數據
insert into t_emp(name, sal, age) values('王琳', 1800, 20),('張昂', 3000, 23),('李冬雪', 4000, 33),('王子安', 6500, 47),('陸佳佳', 7000, 28),('王明', 1000, 26),('邱鈺紅', 2500, 31),('黃燦燦', 10000, 38);# 創建sal索引
create index index_temp_sal on t_emp(sal);# 查詢計劃
explain select * from t_emp where sal > 1500;explain select * from t_emp where sal > 8000;

# 執行計劃
explain select * from t_emp where age is null;# 將age字段全部更新為null
update t_emp set age = null;# 執行計劃
explain select * from t_emp where age is null;

# 執行計劃
explain select * from t_emp where age is not null;# 將age字段全部更新為not null
update t_emp set age = 23;# 執行計劃
explain select * from t_emp where age is not null;


三、指定索引

  1. 當一個字段上既有單列索引,也有復合索引,可以通過下述 SQL 語句指定索引:
    1. use index(索引名):建議使用該索引。MySQL 會根據實際效率考慮是否使用;
    2. ignore index(索引名):忽略該索引;
    3. force?index(索引名):強制使用該索引。
# 查看索引
show index from t_emp;# 為 t_emp 添加一個復合索引
create index index_temp_nsa on t_emp(name, sal, age);# 查看索引
show index from t_emp;# 執行計劃
explain select * from t_emp where name = '郭珊珊';
explain select * from t_emp use index(index_temp_nsa) where name = '郭珊珊';
explain select * from t_emp ignore index(index_temp_name) where name = '郭珊珊';
explain select * from t_emp force index(index_temp_nsa) where name = '郭珊珊';


?四、覆蓋索引

1.說明

? ? ? ? select 后的字段,盡可能是索引所覆蓋的字段,如此可以避免“回表”。

? ? ? ? 盡量避免使用【select * 】,因為其容易導致“回表”操作。


2.實例

? ? ? ? t_user 表字段有:?id,name,password,realname,birth,email。表中數據有600萬條,請針對下述 SQL 給出優化方案。

select id, name, realname from t_user where name = '郭珊珊';

? ? ? ? ?建議給 name 和 realname 兩個字段添加聯合索引,減少回表操作,大大提升效率。


五、前綴索引

? ? ? ? 若一個字段類型是 varchar 或 text,直接對其創建索引會使索引體積較大。

? ? ? ? 那么,可以將字符串前幾個字符截取下來當作索引,這種索引被稱為前綴索引。

# 為t_emp表的name字段前兩個字符創建索引
create index index_temp_subname on t_emp(name(2));# 截取字符數計算公式,其值越接近于1,越具有唯一性
select count(distinct substring(字段名, 1, 前幾個字符)) / count(*) from 表名;select count(distinct substring(name, 1, 2)) / count(*) from t_emp;

六、單列索引與復合索引的選擇

? ? ? ? 當查詢語句有多個條件,建議將這些列創建為復合索引,因為創建單列索引容易造成“回表”操作。


七、創建索引的原則

  1. 表中數據量龐大,通常超過百萬;
  2. 經常出現在 where、order by、group by 后邊的字段建議添加索引;
  3. 創建索引的字段具有較強的唯一性;
  4. 字段存儲文本,內容較大,一定要創建前綴索引;
  5. 盡量使用復合索引,避免回表查詢;
  6. 若一個字段中的數據不會為 null,建議建表時添加 not null 約束。如此優化器知道使用哪個索引列更有效;
  7. 不要創建太多的索引,因為對數據進行增刪改時,索引需要重新排序;
  8. 如果較少查詢,頻繁增刪改,不建議添加索引。

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

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

相關文章

【Oracle】安裝單實例

個人主頁:Guiat 歸屬專欄:Oracle 文章目錄 1. 安裝前的準備工作1.1 硬件和系統要求1.2 檢查系統環境1.3 下載Oracle軟件 2. 系統配置2.1 創建Oracle用戶和組2.2 配置內核參數2.3 配置用戶資源限制2.4 安裝必要的軟件包 3. 目錄結構和環境變量3.1 創建Ora…

6年“豹變”,vivo S30系列引領手機進入場景“體驗定義”時代

出品 | 何璽 排版 | 葉媛 5月29日晚,備受用戶期待的vivo S30系列如約而至。 相比前幾代S系列產品,S30系列變化顯著,堪稱“豹變”。首先,其產品打造思路發生了質變,產品體驗更好,綜合競爭力更為強。其次&a…

線性動態規劃

具有「線性」階段劃分的動態規劃方法統稱為線性動態規劃(簡稱為「線性 DP」),如下圖所示。 一、概念 如果狀態包含多個維度,但是每個維度上都是線性劃分的階段,也屬于線性 DP。比如背包問題、區間 DP、數位 DP 等都屬…

Rust 學習筆記:使用自定義命令擴展 Cargo

Rust 學習筆記:使用自定義命令擴展 Cargo Rust 學習筆記:使用自定義命令擴展 Cargo Rust 學習筆記:使用自定義命令擴展 Cargo Cargo 支持通過 $PATH 中的 cargo-something 形式的二進制文件拓展子命令,而無需修改 Cargo 本身。 …

NodeMediaEdge任務管理

NodeMediaEdge任務管理 簡介 NodeMediaEdge是一款部署在監控攝像機網絡前端中,拉取Onvif或者rtsp/rtmp/http視頻流并使用rtmp/kmp推送到公網流媒體服務器的工具。 在未使用NodeMediaServer的情況下,或是對部分視頻流需要單獨推送的需求,也可…

蒲公英盒子連接問題debug

1、 現象描述 2、問題解決 上圖為整體架構圖,其中左邊一套硬件設備是放在機房,右邊是放在辦公室。左邊的局域網連接了可以訪問外網的路由器,利用蒲公英作為旁路路由將局域網暴露在外網環境下。 我需要通過蒲公英作為旁路路由來進行遠程訪問&…

Golang 依賴注入:構建松耦合架構的關鍵技術

依賴注入(Dependency Injection, DI) 是一種設計模式,用于實現控制反轉(Inversion of Control, IoC),通過將依賴項的創建和管理交給外部組件,而不是在類或函數內部直接創建依賴項,從…

Transformer核心原理

簡介 在人工智能技術飛速發展的今天,Transformer模型憑借其強大的序列處理能力和自注意力機制,成為自然語言處理、計算機視覺、語音識別等領域的核心技術。本文將從基礎理論出發,結合企業級開發實踐,深入解析Transformer模型的原…

虛擬線程與消息隊列:Spring Boot 3.5 中異步架構的演進與選擇

企業級開發領域正在經歷一場翻天覆地的巨變,然而大多數開發者卻對此渾然不覺,完全沒有意識到。Spring Boot 3.5 帶來的革命性的虛擬線程 (Virtual Threads) 和增強的響應式能力,絕不僅僅是小打小鬧的增量改進——它們正在從根本上改變我們對異…

網絡編程(計算機網絡基礎)

認識網絡 1.網絡發展史 ARPnetA(阿帕網)->internet(因特網)->移動互聯網->物聯網 2.局域網與廣域網 局域網 概念:的縮寫是LAN(local area network),顧名思義,是個本地的網絡,只能實現小范圍短距…

Windows Server部署Vue3+Spring Boot項目

在Windows Server 上部署Vue3 Spring Boot前后端分離項目的詳細步驟如下: 一、環境準備 安裝JDK 17 下載JDK MSI安裝包(如Oracle JDK 或 OpenJDK) 雙擊安裝,配置環境變量: JAVA_HOME:JDK安裝路徑&#xf…

CCF CSP 第37次(2025.03)(3_模板展開_C++)(哈希表+stringstream)

CCF CSP 第37次(2025.03)(3_模板展開_C) 解題思路:思路一(哈希表stringstream): 代碼實現代碼實現(思路一(哈希表stringstream))&…

數據安全管理進階:81頁 2024數據安全典型場景案例集【附全文閱讀】

《2024 數據安全典型場景案例集》聚焦政務數據安全,覆蓋數據細粒度治理、授權運營、接口安全、系統接入、批量數據共享、使用側監管、風險監測、賬號管控、第三方人員管理、密碼應用等十大典型場景,剖析各場景風險并提供技術方案,如基于 AI 的…

Leetcode 261. 以圖判樹

1.題目基本信息 1.1.題目描述 給定編號從 0 到 n - 1 的 n 個結點。給定一個整數 n 和一個 edges 列表,其中 edges[i] [ai, bi] 表示圖中節點 ai 和 bi 之間存在一條無向邊。 如果這些邊能夠形成一個合法有效的樹結構,則返回 true ,否則返…

【ISAQB大綱解讀】LG 1-8:區分顯性陳述和隱性假設(R1)

軟件架構師: 應明確提出假設或先決條件,從而防止隱性假設 知道隱性假設可能會導致利益相關方之間的潛在誤解 1. 應明確提出假設或先決條件,防止隱性假設 為什么重要? 隱性假設是架構風險的溫床 例如:假設“所有服務都…

IT運維工具的選擇標準有哪些?

選擇IT運維工具時,可參考以下標準,確保工具適配業務需求且高效易用: 1. 明確業務需求與場景 ? 核心目標:根據運維場景(如監控、自動化、安全等)匹配工具功能。例如,監控大規模集群選Promethe…

MySQL 核心知識整理【一】

一、MySQL存儲引擎對比:InnoDB vs MyISAM 在使用MySQL時,選擇合適的存儲引擎對性能影響很大。最常見的兩個引擎是 InnoDB 和 MyISAM,它們各自的設計目標不同,適用場景也不一樣。 事務與數據安全性方面,InnoDB 支持事…

人工智能在智能制造業中的創新應用與未來趨勢

隨著工業4.0和智能制造的快速發展,人工智能(AI)技術正在深刻改變制造業的各個環節。從生產自動化到質量檢測,從供應鏈優化到設備維護,AI的應用不僅提高了生產效率,還提升了產品質量和企業競爭力。本文將探討…

arc3.2語言sort的時候報錯:(sort < `(2 9 3 7 5 1)) 需要寫成這種:(sort > (pair (list 3 2)))

arc語言sort的時候報錯&#xff1a;(sort < (2 9 3 7 5 1)) arc> (sort < (2 9 3 7 5 1)) Error: "set-car!: expected argument of type <pair>; given: 9609216" arc> (sort < (2 9 3 )) Error: "Function call on inappropriate object…

Ubuntu 24.04 LTS Chrome 中文輸入法(搜狗等)失效?一行命令解決

Ubuntu 24.04 LTS Chrome 中文輸入法&#xff08;搜狗等&#xff09;失效&#xff1f;一行命令解決 在 Ubuntu 24.04 LTS 中&#xff0c;如果你發現 Chrome 瀏覽器用不了搜狗輸入法或其他 Fcitx5 中文輸入法&#xff0c;可以試試下面的方法。 直接上解決方案&#xff1a; 打…