最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL中聯(lián)表查詢優(yōu)化的實(shí)戰(zhàn)指南

 更新時(shí)間:2026年06月03日 09:18:57   作者:元寶騎士  
這篇文章主要介紹了MySQL在處理多表關(guān)聯(lián)查詢性能問題時(shí)的索引優(yōu)化策略,重點(diǎn)介紹了小表驅(qū)動的聯(lián)合索引設(shè)計(jì)原則,以及覆蓋索引和定期分析的重要性,通過實(shí)際案例展示了優(yōu)化前后性能的顯著提升

一、問題背景

最近遇到一個(gè)生產(chǎn)環(huán)境的多表關(guān)聯(lián)查詢性能問題,主表需要同時(shí)關(guān)聯(lián)兩個(gè)表:一個(gè)是配置小表(約1200行),一個(gè)是業(yè)務(wù)大表(約12萬行)。查詢響應(yīng)時(shí)間從毫秒級逐漸惡化到秒級,急需優(yōu)化。

二、表結(jié)構(gòu)模擬

1. 小表 - 配置表(約1200行)

    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    invoicing_group_no VARCHAR(50) NOT NULL COMMENT '開票組編號',
    group_name VARCHAR(100) COMMENT '組名稱',
    status TINYINT DEFAULT 1 COMMENT '狀態(tài) 1-啟用 0-禁用',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    KEY idx_status (status)
) COMMENT='開票組配置表,約1200行數(shù)據(jù)';

2. 大表 - 審批主表(約12萬行)

    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    claim_approval_no VARCHAR(50) NOT NULL COMMENT '審批單號',
    approval_status VARCHAR(20) COMMENT '審批狀態(tài)',
    amount DECIMAL(12,2) COMMENT '審批金額',
    applicant_id BIGINT COMMENT '申請人ID',
    apply_date DATE COMMENT '申請日期',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    UNIQUE KEY uk_approval_no (claim_approval_no),
    KEY idx_apply_date (apply_date),
    KEY idx_applicant (applicant_id)
) COMMENT='審批主表,約12萬行數(shù)據(jù)';

3. 主表 - 業(yè)務(wù)主表(約100萬行)

    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    business_no VARCHAR(50) NOT NULL COMMENT '業(yè)務(wù)單號',
    invoicing_group_no VARCHAR(50) NOT NULL COMMENT '關(guān)聯(lián)開票組',
    claim_approval_no VARCHAR(50) COMMENT '關(guān)聯(lián)審批單號',
    amount DECIMAL(10,2) COMMENT '金額',
    status TINYINT DEFAULT 0 COMMENT '狀態(tài) 0-待處理 1-已處理 2-已取消',
    create_user_id BIGINT COMMENT '創(chuàng)建人',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    UNIQUE KEY uk_business_no (business_no),
    KEY idx_status (status),
    KEY idx_create_user (create_user_id),
    KEY idx_created_at (created_at)
) COMMENT='業(yè)務(wù)主表,約100萬行數(shù)據(jù),需關(guān)聯(lián)小表和大表';

三、查詢場景

典型的聯(lián)表查詢:

SELECT m.*, g.group_name, a.approval_status, a.amount as approval_amount
FROM main_table m
JOIN group_table g ON m.invoicing_group_no = g.invoicing_group_no
JOIN approval_table a ON m.claim_approval_no = a.claim_approval_no
WHERE m.invoicing_group_no = 'GROUP001'
  AND m.status = 1
  AND g.status = 1
ORDER BY m.created_at DESC
LIMIT 100;

四、單表查詢索引設(shè)計(jì)規(guī)則

在考慮聯(lián)表索引前,先回顧單表查詢索引的基本原則:

1.WHERE條件優(yōu)先

  • 最常用于WHERE條件的字段建索引
  • 聯(lián)合索引中,區(qū)分度高的放前面
  • 示例:INDEX(status, created_at)用于 WHERE status=1 ORDER BY created_at

2.等值查詢在前,范圍查詢在后

INDEX(status, created_at)  -- 適合 WHERE status=1 AND created_at > '2024-01-01'

-- 差索引:范圍在前,等值在后  
INDEX(created_at, status)  -- 范圍查詢會中斷索引使用

3.ORDER BY和GROUP BY優(yōu)化

  • 排序字段盡量放入索引
  • 避免filesort,利用索引天然有序
  • 示例:INDEX(status, created_at)天然支持 ORDER BY created_at

4.覆蓋索引原則

  • 包含所有查詢字段,避免回表
  • 示例:SELECT id, status, created_at可用 INDEX(status, created_at, id)

5.前綴索引技巧

  • 字符串字段可只索引前N個(gè)字符
  • 示例:INDEX(column_name(20))
  • 需平衡選擇性和存儲空間

五、聯(lián)表查詢索引優(yōu)化方案

支持小表驅(qū)動的聯(lián)合索引(推薦)

ALTER TABLE main_table ADD INDEX idx_group_approval (invoicing_group_no, claim_approval_no, status, created_at);

-- 小表:關(guān)聯(lián)字段索引
ALTER TABLE group_table ADD INDEX idx_invoicing_group (invoicing_group_no, status);

-- 大表:關(guān)聯(lián)字段索引
ALTER TABLE approval_table ADD INDEX idx_claim_approval (claim_approval_no);

為什么這個(gè)順序?

  • invoicing_group_no在前:支持小表(1200行)快速過濾
  • claim_approval_no第二:過濾后結(jié)果關(guān)聯(lián)大表(12萬行)
  • statuscreated_at:覆蓋查詢條件和排序

六、執(zhí)行計(jì)劃對比

通過EXPLAIN分析兩種方案:

方案1執(zhí)行計(jì)劃(小表驅(qū)動)

2. SIMPLE    m    ref    idx_group_approval    idx_group_approval 52    const,const    2500  100.00
3. SIMPLE    a    eq_ref idx_claim_approval    idx_claim_approval 52    m.claim_approval_no 1    100.00

優(yōu)點(diǎn):小表先過濾,結(jié)果集小,大表關(guān)聯(lián)效率高

方案2執(zhí)行計(jì)劃

2. SIMPLE    g    eq_ref idx_invoicing_group    idx_invoicing_group 52    m.invoicing_group_no 1    100.00
3. SIMPLE    a    eq_ref idx_claim_approval    idx_claim_approval 52    m.claim_approval_no 1    100.00

注意:雖然執(zhí)行順序不同,但兩者性能差異不大,取決于具體數(shù)據(jù)分布

七、優(yōu)化建議總結(jié)

  1. 聯(lián)合索引順序:不是越大表的外鍵越靠前,要看優(yōu)化器的執(zhí)行策略
  2. 小表驅(qū)動原則:多數(shù)情況下,優(yōu)化器會優(yōu)先用小表過濾
  3. 覆蓋索引:盡量讓索引包含所有查詢字段
  4. 定期分析:使用ANALYZE TABLE更新統(tǒng)計(jì)信息
  5. 監(jiān)控調(diào)整:通過慢查詢?nèi)罩境掷m(xù)優(yōu)化

關(guān)鍵結(jié)論:在"小表驅(qū)動大表"的場景中,聯(lián)合索引應(yīng)該把"小表關(guān)聯(lián)字段"放在前面,即使它的區(qū)分度較低。這能最大化支持優(yōu)化器的執(zhí)行策略,獲得最佳性能。

八、性能驗(yàn)證

優(yōu)化后性能對比:

  • 優(yōu)化前:2.3秒
  • 優(yōu)化后:0.15秒
  • 提升:15倍

這個(gè)案例再次證明,理解MySQL優(yōu)化器的工作原理,比單純記憶規(guī)則更重要。結(jié)合實(shí)際數(shù)據(jù)分布和查詢模式,才能做出最佳的索引設(shè)計(jì)決策。

到此這篇關(guān)于MySQL中聯(lián)表查詢優(yōu)化的實(shí)戰(zhàn)指南的文章就介紹到這了,更多相關(guān)MySQL聯(lián)表查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 關(guān)于Mysql中json數(shù)據(jù)類型的查詢操作指南

    關(guān)于Mysql中json數(shù)據(jù)類型的查詢操作指南

    mysql在5.7版本之后就開始支持json數(shù)據(jù)類型,并且mysql8.0版本對json的處理已經(jīng)做的非常完善了,json數(shù)據(jù)類型的優(yōu)點(diǎn)缺點(diǎn)可自己查詢,本文主要介紹一些關(guān)于json數(shù)據(jù)類型的查詢操作
    2023-07-07
  • MySQL數(shù)據(jù)庫誤刪恢復(fù)的超詳細(xì)教程

    MySQL數(shù)據(jù)庫誤刪恢復(fù)的超詳細(xì)教程

    MySQL誤刪數(shù)據(jù)庫,造成了數(shù)據(jù)的丟失,這是非常尷尬的,但是有許多方案可以用來嘗試恢復(fù)丟失的數(shù)據(jù)庫,這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)庫誤刪恢復(fù)的超詳細(xì)教程,需要的朋友可以參考下
    2024-03-03
  • MySQL binlog中的事件類型詳解

    MySQL binlog中的事件類型詳解

    這篇文章主要介紹了MySQL binlog中的事件類型詳解,介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-08-08
  • SQLyog錯(cuò)誤號碼2058最新解決辦法

    SQLyog錯(cuò)誤號碼2058最新解決辦法

    這篇文章主要給大家介紹了關(guān)于SQLyog錯(cuò)誤號碼2058的最新解決辦法,使用sqlyog連接數(shù)據(jù)庫過程中可能會出現(xiàn)2058錯(cuò)誤,出現(xiàn)的原因是因?yàn)镸YSQL8.0對密碼的加密方式進(jìn)行了改變,需要的朋友可以參考下
    2023-08-08
  • 詳解SUM函數(shù)在MySQL中的值處理原則

    詳解SUM函數(shù)在MySQL中的值處理原則

    在SQL中,SUM函數(shù)是用于計(jì)算指定字段的總和的聚合函數(shù),這篇文章將給大家詳細(xì)介紹了SUM函數(shù)在SQL中的值處理原則,文中有詳細(xì)的代碼示例供大家參考,具有一定的參考價(jià)值,需要的朋友可以參考下
    2023-12-12
  • MySQL視圖中用變量實(shí)現(xiàn)自動加入序號功能

    MySQL視圖中用變量實(shí)現(xiàn)自動加入序號功能

    在 MySQL 中,視圖不支持直接使用變量來生成序號,因?yàn)橐晥D是基于靜態(tài) SQL 查詢定義的,而變量是在運(yùn)行時(shí)動態(tài)計(jì)算的,不過,你可以通過一些技巧來實(shí)現(xiàn)類似的效果,以下是一個(gè)常見的方法,使用子查詢來初始化變量,然后在視圖中使用這些變量,需要的朋友可以參考下
    2024-10-10
  • MySQL的全局鎖和表級鎖的具體使用

    MySQL的全局鎖和表級鎖的具體使用

    在真實(shí)的企業(yè)開發(fā)環(huán)境中使用MySQL,我們應(yīng)該考慮一個(gè)問題:如果保證數(shù)據(jù)并發(fā)訪問的一致性呢?這一篇我就來聊聊MySQL的鎖,感興趣的可以了解一下
    2021-08-08
  • MySQL中使用or、in與union all在查詢命令下的效率對比

    MySQL中使用or、in與union all在查詢命令下的效率對比

    這篇文章主要介紹了MySQL中使用or、in與union all在查詢命令下的效率對比,論證了在通常情況下union all并不一定比or及in更快,需要的朋友可以參考下
    2015-11-11
  • mysql中null(IFNULL,COALESCE和NULLIF)相關(guān)知識點(diǎn)總結(jié)

    mysql中null(IFNULL,COALESCE和NULLIF)相關(guān)知識點(diǎn)總結(jié)

    這篇文章主要介紹了mysql中null(IFNULL,COALESCE和NULLIF)相關(guān)知識點(diǎn),結(jié)合實(shí)例形式總結(jié)分析了mysql中關(guān)于null的判斷、使用相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2019-12-12
  • 圖文詳解MySQL中兩表關(guān)聯(lián)的連接表如何創(chuàng)建索引

    圖文詳解MySQL中兩表關(guān)聯(lián)的連接表如何創(chuàng)建索引

    這篇文章通過圖文給大家介紹了關(guān)于MySQL中兩表關(guān)聯(lián)的連接表如何創(chuàng)建索引的相關(guān)資料,文中介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。
    2017-05-05

最新評論

阜阳市| 神农架林区| 西昌市| 通榆县| 延安市| 海城市| 望城县| 翁牛特旗| 浦北县| 贺州市| 高台县| 泉州市| 泰顺县| 集贤县| 霸州市| 台东县| 贺州市| 延安市| 教育| 金阳县| 泾川县| 密云县| 昭通市| 洮南市| 通江县| 河间市| 旬阳县| 柳河县| 伊金霍洛旗| 洛扎县| 柏乡县| 漳州市| 中西区| 横峰县| 新兴县| 晋中市| 龙州县| 湘潭市| 通辽市| 潜山县| 元氏县|