精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

揭秘MySQL優化器:為何索引在手卻選擇全表掃描?

數據庫 MySQL
你是否曾遇到這樣的情況:明明表上有合適的索引,但explain的結果卻顯示 MySQL 選擇了全表掃描?這背后其實是一個看不見的指揮家——MySQL 優化器——基于一系列「成本常數」做出的決策。

前言:一個令人困惑的選擇

1 一個費解的SQL現象

1.1 表結構

1.2 耗時較久的SQL(10秒以上)

1.3 分析下執行計劃

1.4 explain的進階用法

1.5 分析執行計劃

2 查詢 SQL 語句執行流程

2.1 查詢優化器

2.2 執行成本

2.3 MySQL 5.7 版本的默認成本常數

3 執行成本分析

3.1 表統計信息

3.2 命令2 (指定索引) 的執行成本分析

3.3 命令1 (未指定索引) 的執行成本分析

4 優化

5 總結

前言:一個令人困惑的選擇

你是否曾遇到這樣的情況:明明表上有合適的索引,但explain的結果卻顯示 MySQL 選擇了全表掃描?這背后其實是一個看不見的指揮家——MySQL 優化器——基于一系列「成本常數」做出的決策。

今天,我們將深入探索 MySQL 成本常數的奧秘,揭開查詢優化背后的神秘面紗。

1.一個費解的SQL現象

1.1 表結構

CREATE TABLE
`mapping_filter_record` (
    `id`bigint (20) NOTnull AUTO_INCREMENT,
    `source_type`int (11) NOTnullCOMMENT'來源類型',
    `source_id`varchar(64) NOTnullCOMMENT'來源方id',
    -- ... 其他字段省略
    PRIMARY KEY (`id`),
    KEY`idx_source_type` (`source_type`, `update_time`) USING BTREE,
    KEY`idx_source_id` (`source_id`, `source_type`, `state`) USING BTREE
  ) ENGINE = InnoDB AUTO_INCREMENT = 290240042300201321DEFAULTCHARSET = utf8mb4 COMMENT = '商品發布攔截記錄表';

1.2 耗時較久的SQL(10秒以上)

select *
from dbzz_ypofflinemart.mapping_filter_record
WHERE (source_type = 9401003 and source_id = '1814613774586351713')
order by id asc
LIMIT 1;

1.3 分析下執行計劃

需要表數據符合一定情況才會發生以下情況。

explain
select *
from dbzz_ypofflinemart.mapping_filter_record
WHERE (source_type = 9401003 and source_id = '1814613774586351713')
order by id asc
LIMIT 1;

執行計劃結果:圖片

令人困惑的是:使用了主鍵索引(PRIMARY),而非期望的 idx_source_id 索引。

1.4 explain的進階用法

explain可以輸出四種格式:傳統格式、json格式、tree格式以及可視化輸出。

傳統的explain工具只告訴我們結果,沒有告訴我們為什么。而json格式是四種格式里面輸出信息最詳盡的格式,里面包含了執行的成本信息。

我們加上format=json分析下結果。

執行命令1 (未指定索引):

explain format = json
select *
from dbzz_ypofflinemart.mapping_filter_record
WHERE (source_type = 9401003 and source_id = '1814613774586351713')
order by id asc
LIMIT 1;

得到執行計劃1:

{
  "query_block": {
    "select_id": 1,
    "cost_info": {
      "query_cost": "3865.20"
    },
    "ordering_operation": {
      "using_filesort": false,
      "table": {
        "table_name": "mapping_filter_record",
        "access_type": "index",
        "possible_keys": [
          "idx_source_type",
          "idx_source_id"
        ],
        "key": "PRIMARY",
        "used_key_parts": [
          "id"
        ],
        "key_length": "8",
        "rows_examined_per_scan": 501,
        "rows_produced_per_join": 3221,
        "filtered": "4.26",
        "cost_info": {
          "read_cost": "3221.00",
          "eval_cost": "644.20",
          "prefix_cost": "3865.20",
          "data_read_per_join": "92M"
        }
      }
    }
  }
}

強制指定使用idx_source_id索引,再分析執行計劃。 執行 命令2 (指定索引):

explain format = json
select *
from dbzz_ypofflinemart.mapping_filter_record
FORCE INDEX(idx_source_id)
WHERE (source_type = 9401003 and source_id = '1814613774586351713')
order by id asc
LIMIT 1;

得到執行計劃2:

{
  "query_block": {
    "select_id": 1,
    "cost_info": {
      "query_cost": "3865.20"
    },
    "ordering_operation": {
      "using_filesort": true,
      "table": {
        "table_name": "mapping_filter_record",
        "access_type": "ref",
        "possible_keys": [
          "idx_source_id"
        ],
        "key": "idx_source_id",
        "used_key_parts": [
          "source_id",
          "source_type"
        ],
        "key_length": "262",
        "ref": [
          "const",
          "const"
        ],
        "rows_examined_per_scan": 3221,
        "rows_produced_per_join": 3221,
        "filtered": "100.00",
        "cost_info": {
          "read_cost": "3221.00",
          "eval_cost": "644.20",
          "prefix_cost": "3865.20",
          "data_read_per_join": "92M"
        }
      }
    }
  }
}

1.5 分析執行計劃

對比兩個 SQL 的執行成本和排序:

命令

query_cost

using_filesort

命令1

3865.20

false

命令2

3865.20

true

優化器認為使用PRIMARY聚簇索引和idx_source_id二級索引的查詢數據成本相同,但是使用PRIMARY聚簇索引可以按索引順序讀取,無需再次進行排序操作,因此優化器選擇了使用PRIMARY聚簇索引來執行該 SQL。

2.查詢 SQL 語句執行流程

2.1 查詢優化器

優化器的工作流程可以簡化為四個步驟:

  1. 解析 SQL,理解查詢意圖;
  2. 生成多種可能的執行方案;
  3. 基于成本常數計算每種方案的代價;
  4. 選擇成本最低的方案執行。

圖片圖片

2.2 執行成本

下面需要先介紹一些比較枯燥的概念。

SQL執行總成本 = CPU成本 + I/O成本

  • CPU成本

讀取以及檢測記錄是否滿足對應的搜索條件、對結果集進行排序等這些操作損耗的時間稱之為CPU成本。

  • I/O成本

我們的表經常使用的MyISAM、InnoDB存儲引擎都是將數據和索引都存儲到磁盤上的,當我們想查詢表中的記錄時,需要先把數據或者索引加載到內存中然后再操作。將數據從磁盤加載到內存的過程所損耗的時間,稱為I/O成本。

2.3 MySQL 5.7 版本的默認成本常數

在 MySQL 中,成本常數(Cost Constants)是查詢優化器用來評估不同執行計劃的資源消耗的固定數值。這些常數幫助優化器估算執行計劃的I/O和CPU成本,從而選擇最優的執行計劃。

Server層一些操作對應的成本常數:

圖片圖片

存儲引擎層一些操作對應的成本常數:

圖片圖片

3.執行成本分析

3.1 表統計信息

查詢表的一些預估信息,用于成本計算。

show table status like 'mapping_filter_record';

Rows

Avg_row_length

Data_length

Max_data_length

Index_length

Data_free

1615460

9396

15180234752

0

552239104

4194304

3.2 命令2 (指定索引) 的執行成本分析

先根據非聚簇索引(idx_source_id)查詢出對應數據的主鍵,然后通過主鍵回表查詢、篩選需要的數據。

圖片圖片

對命令2的執行成本計算如下:

  • 非聚簇索引CPU成本 = 讀取的記錄數 × 讀取一條記錄的成本 = 1(等值查詢定位到單個索引位置) × 0.2(row_evaluate_cost)
  • 非聚簇索引I/O成本:1(等值查詢定位到單個索引位置) × 1(io_block_read_cost)
  • 回表CPU成本 = 3221(rows_examined_per_scan) × 0.2(row_evaluate_cost)
  • 回表IO成本:3221(rows_examined_per_scan)× 1(io_block_read_cost)
  • 總成本 = 3865.2(非聚簇索引的訪問成本相對于回表成本可以忽略不計)

計算的成本3865.2和執行計劃中的成本3865.20是一致的。

3.3 命令1 (未指定索引) 的執行成本分析

命令1使用主鍵索引,全表掃描的成本是要比正確使用非聚簇索引的成本要高很多的。實際得到的成本確實相同的。

依據1: 我們注意到rows_examined_per_scan(掃描行數)為501這是個很突兀的值。增加需要的結果數量得到以下的數據:

執行語句

使用的索引

掃描行數

實際執行時間

select * from xxx WHERE xxx order by id asc LIMIT 1;

PRIMARY

501

19.4秒

select * from xxx WHERE xxx order by id asc LIMIT 2;

PRIMARY

1003

20.2秒

select * from xxx WHERE xxx order by id asc LIMIT 6;

PRIMARY

3009

20.24秒

select * from xxx WHERE xxx order by id asc LIMIT 7;

idx_source_id

3221

0.026秒

依據2: 表中總數據為 1,615,460 條,符合WHERE條件的數據共 3,221,1,615,460 除以 3,221 約等于 501。

推斷:

  • MySQL 優化器假設數據是均勻分布的,據此估算出每掃描 501 條數據,便可找到一條符合條件的記錄。這樣查詢的效率比通過非聚簇索引再回表的效率高。
  • 當使用limit時,MySQL 的優化器會嘗試通過全表掃描的方式來查詢數據。當掃描行數小于非聚簇索引的掃描行數時,優化器以掃描行數 3221 作為依據計算成本。

以上是基于我遇到的情況基于 MySQL 5.7版本進行的分析,并未找到明確官方說明,有不當之處歡迎大家討論、指正。

4.優化

雖然 MySQL 按照數據均勻分布的假設使用了主鍵索引,但實際的情況查詢的數據大多在表中靠后的位置,就導致了需要掃描百萬行才能找到第一條符合條件的數據。多個此類 SQL 同時執行,會造成數據庫負載過高,進而對相關業務服務產生重大影響。

針對這種情況有很多優化思路。本例中我采用的優化方法是改為子查詢,引導優化器優先使用高效的索引,避免其因成本誤判而選擇全表掃描。

SELECT *
FROM mapping_filter_record 
WHEREid = (
    SELECTid
    FROM mapping_filter_record 
    WHERE source_type = 9401003AND source_id = '1814613774586351713'
    ORDERBYidASC
    LIMIT1
);

5.總結

這個案例深刻揭示了:

  • MySQL 優化器基于成本計算而非直覺進行決策;
  • 成本常數是優化器評估執行計劃的核心依據;
  • 統計信息的準確性直接影響優化器的選擇;
  • 理解成本計算模型是 SQL 性能優化的關鍵。

通過深入理解 MySQL 優化器的工作原理,我們能夠更好地設計索引和優化查詢,提升數據庫整體性能。

思考題:在你的項目中,是否遇到過類似索引失效的情況?歡迎在評論區分享你的經驗和解決方案!

關于作者

路科恒,轉轉JAVA開發工程師,主要負責采貨俠保賣業務的技術方案設計、開發等相關工作。

責任編輯:武曉燕 來源: 轉轉技術
相關推薦

2022-12-05 08:35:06

MySQL計算讀取

2011-03-15 14:19:50

2023-03-07 08:22:34

MySQL優化器

2011-08-24 17:23:10

2023-07-10 09:13:15

count(*)InnoDB

2017-09-05 12:44:15

MySQLSQL優化覆蓋索引

2009-07-08 15:11:58

JVM GC調整優化

2020-05-19 20:45:27

MySQLref優化器

2021-09-25 13:05:10

MYSQL開發數據庫

2022-05-26 08:23:05

MySQL索引數據庫

2022-04-13 10:39:20

濾藍光顯示器筆記本

2009-12-16 13:33:46

2025-10-09 09:32:29

MySQL數據數據庫

2025-02-18 08:10:00

SQL數據表數據庫

2020-10-19 19:45:58

MySQL數據庫優化

2009-11-10 14:03:40

Web服務器維護技巧

2024-10-28 08:34:06

2024-03-06 20:00:50

MySQL優化器索引

2012-02-29 09:44:54

MySQL

2020-09-16 09:53:57

TikTok程序禁令
點贊
收藏

51CTO技術棧公眾號

亚洲韩国在线| 日本乱人伦a精品| 欧美日韩理论片| 成人影欧美片| 懂色av噜噜一区二区三区av| 久久理论片午夜琪琪电影网| 毛茸茸多毛bbb毛多视频| 成人影院大全| 国产精品久久久久影院| 亚洲一区二区在线播放| 五月天婷婷丁香| 日韩手机在线| 欧美男人的天堂一二区| 免费观看亚洲视频| 欧美一区二区三区少妇| 久久成人免费网| 久久久久九九九九| 久久精品国产亚洲av麻豆| 日本久久二区| 亚洲成人一二三| 神马一区二区影院| 亚洲精品18在线观看| 国产精品婷婷| 日韩一区视频在线| 特级西西人体4444xxxx| 日韩毛片一区| 亚洲一二三四区| 视频一区不卡| 天堂v在线观看| 美国欧美日韩国产在线播放| 欧美黄色性视频| 99久久久无码国产精品衣服| 精品视频一区二区三区在线观看| 欧美午夜女人视频在线| 无码毛片aaa在线| 成人在线观看黄色| 成人av动漫在线| 91免费看片网站| 4438国产精品一区二区| 欧美区国产区| 日韩在线视频观看| 人人妻人人藻人人爽欧美一区| 日韩精品三级| 欧美美女bb生活片| 成年人免费大片| a级片在线免费观看| 亚洲欧洲色图综合| 日韩精品久久久免费观看| 无码国产伦一区二区三区视频 | 日韩欧美中文一区二区| www亚洲成人| 久久毛片亚洲| 欧美性黄网官网| 99久久免费观看| 国产激情在线| 国产精品久久久久久久久久久免费看| 精品高清视频| 少妇高潮久久久| 成人激情校园春色| 国产成人免费电影| 亚洲av无码国产综合专区| 国产真实乱偷精品视频免| 国产综合久久久久久| 亚洲中文无码av在线| 日韩在线a电影| 日韩免费在线播放| 中文字幕在线欧美| 久久综合亚州| 欧美有码在线视频| 天天综合网久久综合网| 国产毛片一区| 欧美在线xxx| a v视频在线观看| 99riav1国产精品视频| 91国语精品自产拍在线观看性色| 精品无码黑人又粗又大又长| 最新日韩欧美| 青青草一区二区| 精品一区二区三区无码视频| 一级片黄色免费| 91伊人久久| 欧美无砖专区一中文字| 91制片厂毛片| 伊人久久大香| 91精品中文字幕一区二区三区| 中文字幕资源在线观看| 嫩呦国产一区二区三区av| 日韩一级片在线播放| 一级黄色免费视频| 亚洲国产欧美日韩在线观看第一区 | 国产一区二区三区蝌蚪| 亚洲影院高清在线| 亚洲欧美另类综合| 91亚洲国产成人精品一区二三 | 日韩成人手机在线| 黄色污网站在线观看| 日本韩国欧美在线| 天天综合天天添夜夜添狠狠添| 日本超碰一区二区| 精品中文视频在线| 最新黄色av网址| 欧美精品二区| 91精品国产自产91精品| 一区二区自拍偷拍| 国产成人超碰人人澡人人澡| 久久精品一区二区三区不卡免费视频| 黄色小视频在线免费观看| 亚洲欧美综合在线精品| 被灌满精子的波多野结衣| 日韩大尺度黄色| 69堂国产成人免费视频| 国产一级伦理片| 色喇叭免费久久综合网| 欧美劲爆第一页| 懂色av中文字幕| 国产精品一区二区久激情瑜伽| 九九九九九精品| 欧美性猛交xxx乱大交3蜜桃| 天天色天天爱天天射综合| 免费看污污网站| 久久久久久视频| 日本成人在线网站| 亚洲激情国产精品| 国产精品视频看看| 国产精品乱看| 96国产粉嫩美女| 韩国精品视频| 亚洲成人资源在线| 久国产精品视频| 妖精视频一区二区三区| 欧美福利小视频| 91久久久久久久久久久久| 久久这里只有精品视频网| 欧美少妇一区二区三区| 欧美不卡高清一区二区三区| 亚洲电影免费观看高清完整版在线观看 | 91丝袜国产在线播放| 三上悠亚免费在线观看| 韩日精品一区| 亚洲精品一区二三区不卡| 久操免费在线视频| 久久se这里有精品| 欧美色欧美亚洲另类七区| 日韩在线三级| 国产免费av高清在线| 亚洲成国产人片在线观看| 午夜xxxxx| 成人aaaa| 欧美一级视频在线观看| 亚洲精品一区二区三区区别| 日韩一区中文字幕| 亚洲天堂av线| 欧洲毛片在线视频免费观看| 55夜色66夜色国产精品视频| 欧美一级特黄aaaaaa| 亚洲一区在线播放| 成人免费播放视频| 91精品99| 国产欧美日韩免费| 触手亚洲一区二区三区| 色吊一区二区三区| 中文字幕丰满乱子伦无码专区| 日韩视频一区二区三区在线播放免费观看| 99热最新在线| 影音先锋中文在线视频| 欧美一区二区在线视频| 亚洲二区在线播放| 国产一区欧美日韩| 成人在线免费高清视频| 日韩在线精品强乱中文字幕| 欧美老女人性视频| 国精产品一品二品国精品69xx| 亚洲精品成人悠悠色影视| 国产精品偷伦视频免费观看了| 国内自拍一区| 国产一区二区视频在线免费观看 | 亚洲最大色综合成人av| 欧美黄色成人| 久久精品国产成人| 成人黄色在线观看视频| 亚洲成av人片在线| www.88av| 丝袜亚洲精品中文字幕一区| 久久综合精品一区| 成人网ww555视频免费看| 日韩最新在线视频| a网站在线观看| 亚洲一区二区精品3399| 成人无码www在线看免费| 日韩精品一级中文字幕精品视频免费观看| 日韩免费av电影| 91久久青草| 97色在线视频观看| yw在线观看| 欧美一级免费大片| 在线能看的av| 欧美激情在线看| 又黄又爽又色的视频| 99re国产精品| 中文字幕精品一区日韩| 91精品入口| 清纯唯美亚洲激情| 超碰在线caoporen| 亚洲精品美女网站| 毛片在线免费播放| 一区二区国产视频| 实拍女处破www免费看| 国内精品第一页| 日本wwwcom| 大片网站久久| 动漫精品视频| 免费污视频在线一区| 欧美精品在线免费| 国产三级视频在线| 日韩欧美成人午夜| 成人一级免费视频| 亚洲综合无码一区二区| 欧美偷拍一区二区三区| 国产大陆精品国产| 黄色一级免费大片| 亚洲高清资源| 亚洲欧洲日韩精品| 免费短视频成人日韩| 99久久久精品免费观看国产| 日本欧美不卡| 97久久国产精品| 九七久久人人| 亚洲偷欧美偷国内偷| 免费激情视频网站| 91精品国产综合久久久久久久| 中文字字幕在线中文| 亚洲一区影音先锋| 亚洲精品卡一卡二| 欧美国产日韩精品免费观看| 国产精品扒开腿做爽爽爽a片唱戏 亚洲av成人精品一区二区三区 | 欧美.www| 影音先锋在线亚洲| 国产一区二区在线| 久久久久久久久一区二区| 一区二区在线免费播放| 国产一区私人高清影院| 日本.亚洲电影| 91精品国产乱码久久久久久蜜臀| av网址在线看| 三级精品视频久久久久| 成全电影播放在线观看国语| 日韩精品一区二区视频| 十八禁一区二区三区| 日韩精品影音先锋| www.黄色一片| 69久久夜色精品国产69蝌蚪网| 艳妇乳肉豪妇荡乳av| 欧美午夜寂寞影院| 久久这里只有精品9| 日本电影亚洲天堂一区| 国产精品suv一区| 黄色一区二区在线| 色婷婷av国产精品| 欧美日韩视频免费播放| 97人人澡人人爽人人模亚洲| 亚洲成人久久影院| 日韩欧美亚洲一区二区三区| 一区二区三区精品视频| 久久午夜无码鲁丝片| 亚洲一区二区三区美女| 欧美日韩中文视频| 亚洲国产成人av| 亚洲精品视频在线观看免费视频| 亚洲h精品动漫在线观看| av资源吧首页| 欧美日韩免费在线观看| 天天干天天操天天爱| 在线一区二区三区四区五区| 在线观看亚洲黄色| 欧美日韩一级二级| 国产免费福利视频| 欧美成人艳星乳罩| 色婷婷av一区二区三| 精品粉嫩超白一线天av| 天天操天天干天天插| 亚洲男女自偷自拍图片另类| 国产视频精品久久| 久久精品成人欧美大片古装| 日本高清成人vr专区| 97精品伊人久久久大香线蕉| 黄色综合网址| 国产精品中文久久久久久久| **精品中文字幕一区二区三区| 147欧美人体大胆444| 国产精品丝袜在线播放| 日本不卡在线播放| 久久久久亚洲| 国产v片免费观看| 首页国产欧美久久| 特级西西444www| 成熟亚洲日本毛茸茸凸凹| 大又大又粗又硬又爽少妇毛片 | 国产精品久久久久久久久久新婚 | 亚洲免费视频网站| 国产激情视频在线| 97精品在线观看| 日本午夜精品久久久久| 国产美女精品在线观看| 欧美日韩水蜜桃| 992tv快乐视频| 久久久久一区| 国产毛片久久久久久| 久久久99久久| 黄页网站免费观看| 在线看日本不卡| 午夜精品久久久久久久99热黄桃| 亚洲奶大毛多的老太婆| 成人video亚洲精品| 日本韩国在线不卡| 日韩视频一区二区三区四区| 日韩久久精品一区二区三区| 欧美午夜视频| 麻豆三级在线观看| 99视频一区二区| 黄色录像二级片| 色哟哟在线观看一区二区三区| 国产女人18毛片水真多| 国产一区二区三区视频在线观看| 青草av在线| 国产色综合天天综合网| 夜色77av精品影院| 精品国产一区二区三区无码| 久久精品国产99| 久久久久久九九九九九| 亚洲福利一二三区| 国产高清免费在线观看| 一本色道久久综合亚洲精品小说| 超黄网站在线观看| 亚洲va电影大全| 日产午夜精品一线二线三线| 97超碰青青草| 成人国产在线观看| 国产免费无码一区二区视频| 欧美日韩在线综合| 美国一级片在线免费观看视频| 久久久免费在线观看| 欧美专区视频| 中文字幕精品—区二区日日骚| 日韩电影在线一区二区| 五级黄高潮片90分钟视频| 午夜久久福利影院| 亚洲av无码片一区二区三区| 久久久www成人免费精品张筱雨 | 亚洲国产va精品久久久不卡综合| 国产模特av私拍大尺度| 日韩在线免费av| 国产激情久久| 亚洲精品成人久久久998| 日韩在线播放一区二区| 久久只有这里有精品| 欧美日韩一区免费| 青春草在线观看| 欧洲亚洲女同hd| 精品中文字幕一区二区三区av| 久久久999免费视频| 97精品久久久久中文字幕| 影音先锋亚洲天堂| 精品亚洲一区二区三区四区五区| 密臀av在线播放| 麻豆久久久9性大片| 蜜桃久久av| 国产jjizz一区二区三区视频| 在线观看三级视频欧美| www日韩tube| 国产在线视频2019最新视频| 99久久久久国产精品| 国产5g成人5g天天爽| 一区二区三区欧美日韩| 好吊色视频一区二区| 17婷婷久久www| 国产一区二区观看| 欧美一级视频在线| 亚洲精品乱码久久久久久久久| www.国产麻豆| 97香蕉久久夜色精品国产| 蜜臀久久99精品久久一区二区| 久久久久久三级| 亚洲色大成网站www久久九九| 精品国产黄色片| 97av在线影院| 成人综合久久| 亚洲911精品成人18网站| 欧美日韩国产色| porn视频在线观看| 痴汉一区二区三区| 久久国产免费| 天海翼在线视频| 精品国产髙清在线看国产毛片| a日韩av网址| 伊人久久大香线蕉精品| 成人精品免费网站| 无码aⅴ精品一区二区三区| 日韩中文有码在线视频| 都市激情亚洲欧美| 中文字幕国产传媒|