精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

粉嫩精品久久99综合一区| 日本国产在线播放| 亚洲AV午夜精品| 国产亚洲午夜| 中文字幕日韩av| 一本之道在线视频| 不卡av播放| 亚洲视频一区在线观看| 国产精品v欧美精品v日韩| 九九九在线观看| 外国成人激情视频| 日韩久久午夜影院| 五月天国产视频| 欧美gay视频| 亚洲精品国产第一综合99久久| 国产手机精品在线| 国产又粗又猛又爽又黄的| 尤物在线精品| 久久精品中文字幕电影| 泷泽萝拉在线播放| 亚洲精品观看| 欧美人与禽zozo性伦| 九色自拍视频在线观看| 成人直播在线| 久久久久久久精| 国产另类第一区| 99久久国产热无码精品免费| 丝袜美腿亚洲一区| 欧美激情久久久久久| 激情无码人妻又粗又大| 免费不卡中文字幕在线| 亚洲大胆人体av| 波多野结衣网页| 婷婷激情成人| 欧美三级三级三级| 青青在线免费观看视频| 午夜影院在线播放| 亚洲成av人片在线观看| 青青在线免费观看| 欧美午夜大胆人体| 一区二区三区波多野结衣在线观看| 偷拍视频一区二区| 九色在线播放| 久久综合狠狠综合久久综合88| 成人啪啪免费看| 欧美成人一区二区视频| 久久精品盗摄| 国产91色在线| 精品视频一二三区| 日韩黄色免费网站| 国产精品人成电影| 在线观看视频中文字幕| 久热成人在线视频| 国产一区二区在线免费| 中文字幕视频二区| 久久精品国产精品亚洲精品| 国产精品夜色7777狼人| 中文天堂在线资源| 麻豆一区二区三| 国产欧美精品一区二区| 97人妻一区二区精品免费视频| 精品在线播放免费| 91精品久久久久久蜜桃| 亚洲老妇色熟女老太| 成人午夜激情在线| 狠狠久久综合婷婷不卡| 亚洲色图 校园春色| 久久综合九色综合97婷婷女人| 精品一区二区三区免费毛片| 亚洲 另类 春色 国产| 久久影院电视剧免费观看| 欧美一区三区二区在线观看| 岛国在线视频免费看| 国产精品福利在线播放| 日本a在线天堂| 天堂√中文最新版在线| 欧洲亚洲国产日韩| 亚洲免费av一区| 一区中文字幕电影| 精品亚洲国产视频| 国产黄色大片免费看| 欧美第一精品| 久久人91精品久久久久久不卡| 青草视频在线观看免费| 六月婷婷色综合| 岛国一区二区三区高清视频| 青春草在线观看| 国产精品久久久久影院老司| 蜜桃网站在线观看| 成人做爰视频www网站小优视频| 欧美自拍偷拍午夜视频| 久久aaaa片一区二区| 台湾佬综合网| 久久香蕉频线观| av图片在线观看| 国产在线视频一区二区| 鲁丝一区鲁丝二区鲁丝三区| 日本黄色片在线观看| 天天亚洲美女在线视频| 激情五月俺来也| 美女av一区| 日韩一区二区三区xxxx| 91精品国产乱码久久久张津瑜| 免费在线观看成人| 精品久久久久久综合日本| 91大神xh98hx在线播放| 亚瑟在线精品视频| 国产永久免费网站| 免费av一区二区三区四区| 精品中文字幕在线观看| 国产又粗又猛又爽又| 成年人国产精品| 国产麻豆电影在线观看| 欧美电影免费看| 亚洲黄一区二区| 成年人av电影| 麻豆精品在线视频| 欧美日韩电影一区二区| 少妇视频在线| 欧美二区三区的天堂| 国产中年熟女高潮大集合| 伊人久久大香线蕉av超碰演员| 国产美女被下药99| 国模精品一区二区| 精品久久久免费| 国产a级片视频| 香蕉精品视频在线观看| 国产成人精品综合| 日韩av视屏| 精品国产户外野外| 国产伦精品一区二区三区88av| 999久久久亚洲| 国产精品美女在线| 国产视频第一页在线观看| 狠狠色噜噜狠狠狠狠97| www.男人天堂| 亚洲激情黄色| 国产亚洲一区在线播放| 色呦呦视频在线观看| 91精品国产入口| 三级黄色录像视频| 狠狠色狠狠色合久久伊人| 中文字幕久精品免| 婷婷久久免费视频| 久久色精品视频| 97超碰人人草| 亚洲女爱视频在线| 性久久久久久久久久久久久久| 欧美黄色大片在线观看| 成人xvideos免费视频| av电影在线观看| 欧美日韩午夜在线| 日本 欧美 国产| 国产在线视频精品一区| 一级特黄妇女高潮| 亚洲视频国产精品| 久久久久久国产| 污污视频在线观看网站| 日韩欧美国产一区二区| 少妇久久久久久久久久| 日本视频在线一区| 一区二区三区在线视频111| www.91精品| 欧美激情欧美激情| 手机看片福利永久| 在线看日本不卡| 国产精品免费人成网站酒店| 国产不卡视频一区| 成人在线免费观看av| 国产真实有声精品录音| 国产日韩在线视频| 在线电影福利片| 日韩精品免费看| 中国一级特黄视频| 亚洲一本大道在线| 久久久亚洲av波多野结衣| 久久综合导航| 中文字幕乱码免费| 欧美偷窥清纯综合图区| 国产精品久久久久久一区二区| 老司机午夜在线视频| 精品国产免费人成电影在线观看四季| 日本高清www免费视频| 欧美高清在线视频| 日本一级大毛片a一| 久久亚洲国产精品一区二区| 国产精品99久久久久久大便| 女同一区二区三区| 成人黄色中文字幕| 一二三四视频在线中文| 久久韩剧网电视剧| 特黄视频在线观看| 欧美日韩你懂得| 亚洲免费在线观看av| 日韩一区在线看| 亚洲中文字幕无码av| 久久99精品国产.久久久久久| 日韩精品一区在线视频| 日韩dvd碟片| 久久国产精品高清| av在线精品| 国产精品电影网站| 69av成人| 另类色图亚洲色图| 国产在线免费观看| 亚洲成人a**站| 国产乱淫片视频| 色美美综合视频| 精品成人免费视频| 亚洲精品国产a| 国产美女永久免费无遮挡| 成人av一区二区三区| 中文字幕在线视频精品| 日韩—二三区免费观看av| 分分操这里只有精品| 亚洲成人最新网站| 婷婷五月色综合| 国产成人影院| 久久久av水蜜桃| 999精品视频在这里| 成人在线免费观看视视频| 欧美片第一页| 欧美在线观看网站| 第四色日韩影片| 欧美精品一本久久男人的天堂| av影片在线看| 亚洲人永久免费| 视频二区在线| 亚洲国产欧美一区| 亚洲国产日韩在线观看| 91精品欧美福利在线观看| 中文字幕男人天堂| 在线观看日韩精品| www.久久精品视频| 色综合一区二区| 国产成人免费观看视频| 精品久久久久久久久久久久久久| 国产一级片网址| 亚洲综合色网站| 久久久久久久久久久网 | 99热国产在线| 日韩最新在线视频| 巨大荫蒂视频欧美另类大| 丝袜亚洲欧美日韩综合| 在线免费黄色| www.日本久久久久com.| 免费网站黄在线观看| 色阁综合伊人av| 国产在线观看av| 九九久久综合网站| 黄视频在线免费看| 国内精品久久久久久影视8| 91老司机福利在线| 欧美一级免费看| 精品免费av在线| 国产精品久久网| 欧美成人aaa| 92国产精品久久久久首页| 亚洲精品黑牛一区二区三区| 国产精品我不卡| 免费看成人哺乳视频网站| 日韩中文一区| 91精品亚洲| 久久精品xxx| 久久精品天堂| 欧美日韩亚洲自拍| 国产一区二区不卡| 精品熟女一区二区三区| 久久新电视剧免费观看| 娇妻被老王脔到高潮失禁视频| 国产精品久久久久久久久果冻传媒 | 99999精品视频| 六月丁香婷婷色狠狠久久| 亚洲黄色av片| 99久久er热在这里只有精品15| 精品无码国产污污污免费网站| 国产精品麻豆99久久久久久| 青青草偷拍视频| 精品日韩中文字幕| 自拍偷拍福利视频| 精品人伦一区二区色婷婷| 日本私人网站在线观看| 日韩视频―中文字幕| 欧美人体视频xxxxx| 热re91久久精品国99热蜜臀| 伊人久久一区| 久久综合毛片| 欧美不卡视频| 日本在线观看a| 国产酒店精品激情| 欧美熟妇一区二区| 亚洲精品videosex极品| 无码人妻黑人中文字幕| 欧美一二三四在线| 成人亚洲性情网站www在线观看| 欧美xxxx综合视频| 亚洲精品国产嫩草在线观看| 99在线视频免费观看| 操欧美老女人| h无码动漫在线观看| 麻豆9191精品国产| 制服下的诱惑暮生| 亚洲国产成人一区二区三区| 日本熟妇一区二区| 欧美精品欧美精品系列| 欧美另类自拍| 久久久视频在线| 成人国产精品久久| 色就是色欧美| 国产亚洲精品bv在线观看| 三级网站免费看| 国产欧美1区2区3区| 日韩高清免费av| 欧美一级午夜免费电影| av影片在线看| 国产盗摄xxxx视频xxx69| 久久男人av| 日韩精品一区二区在线视频| 精品亚洲成av人在线观看| 美女洗澡无遮挡| 狠狠做深爱婷婷久久综合一区| 亚洲天堂狠狠干| 亚洲区免费影片| 色老头在线一区二区三区| 99影视tv| 欧美精品日韩| 亚洲国产午夜精品| 国产精品久久久久久一区二区三区| 亚洲永久精品在线观看| 亚洲大胆美女视频| 不卡av免费观看| 成人情视频高清免费观看电影| 国产精品久久久久一区二区三区厕所| 午夜激情福利在线| 国产喂奶挤奶一区二区三区| 五月天婷婷激情| 日韩久久免费视频| 欧美黑人巨大xxxxx| 久久涩涩网站| 久久一区国产| 久久婷婷五月综合| 欧美日韩一区高清| 日本在线免费看| 成人美女免费网站视频| 99久久夜色精品国产亚洲狼 | 成人毛片18女人毛片| 亚洲国产一区二区三区四区| 51av在线| 欧美日韩精品综合| 日本视频中文字幕一区二区三区| 老头老太做爰xxx视频| 欧美调教femdomvk| 欧美精品hd| 亚洲一区久久久| 亚洲一级高清| 欧美一区二区三区成人精品| 日韩人体视频一二区| 啊v在线视频| 91天堂在线观看| 国产综合色产| 中文乱码人妻一区二区三区视频| 精品久久久久久亚洲精品| 久久精品蜜桃| 国产精品香蕉在线观看| 香蕉视频国产精品| 潘金莲一级淫片aaaaa| 午夜精品福利一区二区三区av| 欧美日韩视频精品二区| 国产精品免费小视频| 欧美在线不卡| 亚洲精品乱码久久久久久不卡| 91黄色免费看| gogo在线观看| 久久成人资源| 韩国一区二区视频| 欧美亚洲天堂网| 国产亚洲精品综合一区91| 国产美女视频一区二区| 大j8黑人w巨大888a片| 欧美国产日韩a欧美在线观看| 99热这里只有精品9| 国产91精品久久久久久| 久久在线电影| 国产精品久久久免费观看| 欧美视频一区在线| ririsao久久精品一区| 秋霞在线观看一区二区三区| 狠狠色丁香久久婷婷综| 日本在线视频免费| 色婷婷成人综合| 日韩高清一级| 三级黄色片免费看| 色偷偷88欧美精品久久久| 影音先锋男人在线资源| 日韩视频精品| av综合在线播放| 国产精品无码免费播放| 热99在线视频| 影音先锋亚洲电影| 成人免费精品动漫网站|