MySQL強化關鍵_020_SQL 優化

目? 錄

一、order by 優化

1.未添加索引?

2.添加索引?

3.復合索引默認升序排列

4.復合索引降序排列

5.復合索引升序降序排列并用

6.總結

?二、group by 優化

1.未添加索引?

2.添加索引

3.添加復合索引?

三、limit 優化

四、主鍵優化?

1.主鍵設計原則

?五、insert 優化

1.原則

2.load

六、count 優化

七、update 優化

1.說明

2.行級鎖

(1)修改同一條記錄?

(2)修改不同記錄

3.表級鎖


一、order by 優化

# 初始化
drop table if exists t_workers;
create table t_workers(id int primary key auto_increment,name varchar(10),age int,sal int
);
insert into t_workers(name, age, sal) values('王棟梁', 18, 3000),('李建', 23, 5000),('張昊晟', 31, 2500);
  1. 使用【explain】查看帶有【order by】語句的執行計劃時,【Extra】字段會顯示 using index 或 using filesort。區別如下:
    1. using index:表示使用索引,因為索引提前排好序,所以效率很高;
    2. using filesort:表示使用文件排序,排序時將硬盤中的數據讀取到內存中,在內存中排序,效率較低。
  2. 初始化中的實例如下。

1.未添加索引?

-- 未添加索引,根據name進行文件排序,效率較低
explain select id, name from t_workers order by name;


2.添加索引?

-- 創建索引,效率提高
create index index_tworkers_name on t_workers(name);
explain select id, name from t_workers order by name;


3.復合索引默認升序排列

-- 若需要通過兩個字段排序,建議添加復合索引。按照age升序排,age相同按照sal升序
create index index_tworkers_as on t_workers(age, sal);
explain select id, age, sal from t_workers order by age, sal;


4.復合索引降序排列

? ? ? ? B+樹葉子結點上所有數據默認升序排列。添加聯合索引,若按照 age 降序排列,age 相同則按照 sal 降序排列,會使用索引嗎?

explain select id, age, sal from t_workers order by age desc, sal desc;

? ? ? ? 答案是會的,可以看到進行了 反向索引掃描。

? ? ? ? B+樹葉子節點之間采用雙向指針,可以從左向右升序,也可以從右往左降序。


5.復合索引升序降序排列并用

-- age升序,sal降序
explain select id, age, sal from t_workers order by age asc, sal desc;

? ? ? ? 可以看到 age 使用了索引,而 sal 沒有使用索引。

? ? ? ? 但是,可以創建對應的指定排序索引解決此問題。

-- 創建指定排序索引
create index index_tworkers_as2 on t_workers(age asc, sal desc);
explain select id, age, sal from t_workers order by age asc, sal desc;


6.總結

  1. 排序也遵循最左前綴原則

  2. 使用覆蓋索引

  3. 針對不同排序規則,創建不同索引。若所有字段都是升序或都是降序,則不需要創建指定排序索引;

  4. 若無法避免 filesort,要注意排序緩存大小,默認緩存大小是 256KB,可以修改系統變量 sort_buffer_size。?


?二、group by 優化

# 初始化
drop table if exists t_employees;
create table t_employees(id int primary key auto_increment,name varchar(10),age int,gender varchar(2),job varchar(10)
);
insert into t_employees(name, age, gender, job) values('劉佳佳', 21, '女', '業務員'),('王平', 23, '男', '業務員'),('郭東', 37, '男', '業務員'),('張筱雨', 32, '女', '經理'),('馬菲燕', 45, '女', '經理'),('張強', 52, '男', '安保'),('寇愛國', 49, '男', '安保'),('邱政琪', 38, '男', '會計');

1.未添加索引?

explain select job, count(*) from t_employees group by job;

? ? ? ? ?可以看到,使用了臨時表,效率較低。


2.添加索引

create index index_temployees_job on t_employees(job);
explain select job, count(*) from t_employees group by job;


3.添加復合索引?

create index index_temployees_aj on t_employees(job, age);
explain select age, count(*) from t_employees group by age;
explain select age, count(*) from t_employees where job = '經理' group by age;

? ? ? ? 可以看到,group by 也遵循最左前綴原則。?


三、limit 優化

? ? ? ? 數據量特別龐大時,使用 limit 讀取數據時,越往后效率越低。可以使用【覆蓋索引 + 子查詢】的方式提升效率。


四、主鍵優化?

1.主鍵設計原則

  1. 主鍵值不要太長,二級索引葉子結點上存儲的是主鍵值。主鍵值太長會導致索引占用空間較大;
  2. 盡量使用【auto_increment】生成主鍵,盡量不使用 uuid 作為主鍵,因為 uuid 不是順序插入;
  3. 插入數據時,主鍵值盡量順序插入,因為亂序插入可能會導致 B+樹 的葉子結點頻繁進行頁分裂和頁合并操作,效率較低。
    1. 在 InnoDB 中,主鍵值對應聚集索引,插入主鍵值如果是亂序的,B+樹葉子結點需要不斷重新排序,重新排序過程中頻繁涉及頁分裂和頁合并操作,效率較低;
    2. B+樹每個結點都存儲在頁中,一個頁面中存儲一個結點;
    3. MySQL 的 InnoDB 存儲引擎,一個頁可以存儲 16KB 的數據;
    4. 若主鍵值不是順序插入,就會導致頻繁的頁分裂和頁合并。在一個B+樹中,頁分裂和頁合并是樹自動調整機制的一部分。當一個頁已經滿了,再插入一個新的關鍵字時就會觸發頁分裂操作,將頁中的關鍵字分配到兩個新的頁中,同時調整樹的結構。相反,當一個頁中的關鍵字數量下降到一個閾值以下時,就會觸發頁合并操作,將兩個相鄰的頁合并成一個新的頁。如果主鍵值是隨機的、不是順序插入的,那么頁的利用率會降低,頁分裂和頁合并的次數就會增加。由于頁的分裂和合并是比較耗時的操作,頻繁的分裂和合并會降低數據庫系統的性能。因此,為了優化B+樹的性能,可以將主鍵值設計成順序插入的,這樣可以減少頁的分裂和合并的次數,提高B+樹的性能。在實際應用中,如果對主鍵值的順序性能要求不是特別高,也可以采用一些技術手段來減少頁分裂和合并,例如B+樹分裂時采用“延遲分裂”技術,或者通過調整頁的大小和結點的大小等方式來優化B+樹的性能。

  4. 盡量不使用業務主鍵,因為業務的變化會導致主鍵值頻繁修改。不建議主鍵值修改,因為主鍵值修改,聚集索引一定會重新排序。


    ?五、insert 優化

    1.原則

    1. 數據量較大時,可以批量插入。建議一次插入數據不超過 1000 條;
    2. MySQL 默認自動提交事務,只要執行一條?DML 語句就會自動提交一次。因此,當插入大量數據時,建議手動開啟事務和手動提交事務
    3. 主鍵值建議順序插入,效率較高;
    4. 超大數據量插入可以考慮使用 load 命令,可以將 csv 文件中的數據批量導入到數據庫表中,效率較高。每個字段間使用 “,” 隔開,每條數據另起一行。

    2.load

    # 1.登錄MySQL時指定參數
    mysql --local-infile -u[用戶名] -p[密碼]# 2.開啟local_infile功能
    set global local_infile = 1;# 3.執行load指令
    -- 首先,創建表
    load data local infile '文件存放路徑' into table [表名] fields terminated by ',' lines terminated by '\n';

    六、count 優化

    1. 使用:
      1. count(主鍵):將每個主鍵值取出累加;
      2. count(常量值):獲取每個常量值累加;
      3. count(字段):取出字段的每個值,判斷是否為 NULL,不為 NULL則累加;
      4. count(*):不取值,直接統計總行數,效率最高。若統計一張表中總行數,建議使用。
    2. 注意:
      1. 對于 InnoDB 存儲引擎,count 計數實現原理就是將表中每一條數據取出,然后累加。若想真正提高效率,可以使用其他程序實現;
      2. 對于 MyISAM 存儲引擎,當一個 select 語句沒有 where 條件時,獲取總行數效率極高,不需要統計,因為 MyISAM 存儲引擎單獨維護了一個總行數。

    七、update 優化

    1.說明

    1. 存儲引擎是 InnoDB 時,表的行級鎖是針對索引添加的鎖,若索引失效或不是索引列時,會提升為表級鎖;
    2. 行級鎖:有 A、B 兩個事務,開啟 A 事務后,通過 A 事務修改表中某條記錄。修改后未提交,B 事務去修改同一條記錄時無法繼續,直到 A 事務提交,B 事務才可以繼續;
    3. 為了提高效率,建議為 update 語句中的 where 條件添加索引。

    2.行級鎖

    (1)修改同一條記錄?

    ? ? ? ? 行級鎖,A 事務修改未提交,B 事務修改同一條記錄,會無法繼續執行。


    (2)修改不同記錄

    ? ? ? ? 行級鎖,A 事務修改未提交,B 事務修改其他記錄,不會影響。


    3.表級鎖

    ? ? ? ? 條件為非索引列或索引失效會升級為表級鎖。表級鎖,A 事務修改未提交。B 事務無論修改哪一條記錄,都不會繼續執行。

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

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

    相關文章

    湖北理元理律師事務所視角:企業債務優化的三維平衡之道

    核心提示:債務優化的本質不是消滅債務,而是在法律框架內重建財務可持續性。 一、企業債務危機的典型誤區 某制造企業主曾向我坦言:“用新貸還舊貸3年,債務從200萬滾到500萬。”這類案例暴露出企業債務處置的共性痛點&#xff1a…

    【Ragflow】27.RagflowPlus(v0.4.1):小版本迭代,問題修復與功能優化

    概述 RagflowPlus v0.4.0 在發布后,收到了積極的反饋,同時也包含一些問題。 本次進行一輪小版本更新,發布 v0.4.1 版本,對已知問題進行修復,并對部分功能進行進一步優化。 開源地址:https://github.com/…

    【hadoop】Flink安裝部署

    一、單機模式 步驟: 1、使用XFTP將Flink安裝包flink-1.13.5-bin-scala_2.11.tgz發送到master機器的主目錄。 2、解壓安裝包: tar -zxvf ~/flink-1.13.5-bin-scala_2.11.tgz 3、修改文件夾的名字,將其改為flume,或者創建軟連接…

    Linux 下 ChromeDriver 安裝

    個人博客地址:Linux 下 ChromeDriver 安裝 | 一張假鈔的真實世界 Selenium 是一個用于 Web 應用程序測試的工具。可以通過它驅動瀏覽器執行特定的操作,如點擊、下滑、資源加載與渲染等。該工具在爬蟲開發中也非常有幫助。Selenium 需要通過瀏覽器驅動操…

    Canal環境搭建并實現和ES數據同步

    作者:田超凡 日期:2025年6月7日 Canal安裝,啟動端口11111、8082: 安裝canal-deployer服務端: https://github.com/alibaba/canal/releases/1.1.7/canal.deployer-1.1.7.tar.gz cd /opt/homebrew/etc mkdir canal…

    STM32使用土壤濕度傳感器

    1.1 介紹: 土壤濕度傳感器是一種傳感裝置,主要用于檢測土壤濕度的大小,并廣泛應用于汽車自動刮水系統、智能燈光系統和智能天窗系統等。傳感器采用優質FR-04雙料,大面積5.0 * 4.0厘米,鍍鎳處理面。 它具有抗氧化&…

    鎖的藝術:深入淺出講解樂觀鎖與悲觀鎖

    在多線程和分布式系統中,數據一致性是一個核心問題。鎖機制作為解決并發沖突的重要手段,被廣泛應用于各種場景。樂觀鎖和悲觀鎖是兩種常見的鎖策略,它們在設計理念、實現方式和適用場景上各有特點。本文將深入探討樂觀鎖和悲觀鎖的原理、實現…

    Jinja2深度解析與應用指南

    1. 概念與用途 1.1 核心概念 Jinja2是Python生態中功能強大的模板引擎,采用邏輯與表現分離的設計思想: 模板:包含靜態內容和動態占位符的文本文件(.j2后綴)渲染:將模板與數據結合生成最終文本的過程上下…

    Ubuntu20.04中 Redis 的安裝和配置

    Ubuntu20.04 中 Redis 的安裝和配置 Ubuntu 安裝 MySQL 及其配置 1. Redis 的安裝 更新系統包列表并安裝 Redis : # 更新包管理工具 sudo apt update# -y:自動確認所有提示(非交互式安裝) sudo apt install -y redis-server測…

    Sklearn 機器學習 缺失值處理 填充數據列的缺失值

    ??親愛的技術愛好者們,熱烈歡迎來到 Kant2048 的博客!我是 Thomas Kant,很開心能在CSDN上與你們相遇~?? 本博客的精華專欄: 【自動化測試】 【測試經驗】 【人工智能】 【Python】 ??使用 Scikit-learn 處理數據缺失值的完整指南 在機器學習項目中,數據缺失是不可避…

    Unity中如何播放視頻

    1.創建一個原始圖像并調整布局平鋪整個畫布 2.創建自定義紋理并調整自定義紋理大小 3.添加視頻播放組件 4.將準備好的視頻素材拖入到視頻剪輯中 5.將自定義紋理拖入到目標紋理中 6.將自定義紋理拖入到原始圖像的紋理中 最后運行游戲,即可播放視頻 總結:

    Spring通用類型轉換的實現原理

    Spring通用類型轉換的實現原理 設計思路實現邏輯ConversionService&#xff1a;類型轉換服務入口ConverterRegister&#xff1a;轉換器注冊接口GenericConversionService1. Map<ConvertiblePair, GenericConverter> converters2. canConvert() 與 convert()&#xff1a;服…

    紅黑樹完全指南:為何工程都用它?原理、實現、場景、誤區全解析

    紅黑樹完全指南&#xff1a;為何工程都用它&#xff1f;原理、實現、場景、誤區全解析 作者&#xff1a;星之辰 標簽&#xff1a;#紅黑樹 #平衡二叉查找樹 #工程實踐 #數據結構 #面試寶典 引子&#xff1a;工程師的“性能焦慮”與樹的進化史 你以為樹只是算法題里的配角&#…

    阿里云 RDS mysql 5.7 怎么 添加白名單 并鏈接數據庫

    阿里云 RDS mysql 5.7 怎么 添加白名單 并鏈接數據庫 最近幫朋友 完成一些運維工作 &#xff0c;這里記錄一下。 文章目錄 阿里云 RDS mysql 5.7 怎么 添加白名單 并鏈接數據庫最近幫朋友 完成一些運維工作 &#xff0c;這里記錄一下。 阿里云 RDS MySQL 5.7 添加白名單1. 登錄…

    Psychopy音頻的使用

    Psychopy音頻的使用 本文主要解決以下問題&#xff1a; 指定音頻引擎與設備&#xff1b;播放音頻文件 本文所使用的環境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音頻配置 Psychopy文檔鏈接為Sound - for audio playback — Psy…

    分布式互斥算法

    1. 概述&#xff1a;什么是分布式互斥 假設有兩個小孩想玩同一個玩具&#xff08;臨界資源&#xff09;&#xff0c;但玩具只有一個&#xff0c;必須保證一次只有一個人能夠玩。當一個小孩在玩時&#xff0c;另一個小孩只能原地等待&#xff0c;直到玩完才能輪到自己。這就是 …

    [創業之路-410]:經濟學 - 國富論的核心思想和觀點,以及對創業者的啟發

    一、國富論的核心思想和觀點 《國富論》全稱為《國民財富的性質和原因的研究》&#xff0c;由英國經濟學家亞當斯密于1776年出版&#xff0c;是經濟學領域的經典之作&#xff0c;其核心思想和觀點對現代經濟學的發展產生了深遠影響&#xff0c;具體如下&#xff1a; 勞動價值…

    Tavily 技術詳解:為大模型提供實時搜索增強的利器

    目錄 &#x1f680; Tavily 技術詳解&#xff1a;為大模型提供實時搜索增強的利器 &#x1f9e9; 為什么需要 Tavily&#xff1f; &#x1f50d; Tavily 是什么&#xff1f; 核心特性&#xff1a; &#x1f4e6; Tavily 在 RAG 架構中的位置 &#x1f9ea; 示例&#xff…

    欣佰特科技亮相2025張江具身智能開發者大會:呈現人形機器人全鏈條解決方案

    5月29日 &#xff0c;2025年張江具身智能開發者大會在上海落下帷幕。欣佰特科技作為專注人形機器人與具身智能領域的創新企業&#xff0c;攜一系列前沿產品與解決方案參展&#xff0c;與全球行業專家、企業共同探討技術落地路徑&#xff0c;展現其在具身智能領域的技術積累與場…

    @Prometheus 監控-MySQL (Mysqld Exporter)

    文章目錄 **Prometheus 監控 MySQL ****1. 目標****2. 環境準備****2.1 所需組件****2.2 權限要求** **3. 部署 mysqld_exporter****3.1 下載與安裝****3.2 創建配置文件****3.3 創建 Systemd 服務****3.4 驗證 Exporter** **4. 配置 Prometheus****4.1 添加 Job 到 prometheus…