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

99%的人會踩MySQL這個坑!

數據庫 MySQL
今天跟大家聊一個 MySQL 的 Bug,這個 Bug 99% 的人會踩坑,不信咱們一起來看一看。

 [[429008]]

圖片來自 包圖網

這周收到一個 sentry 報警,如下 SQL 查詢超時了。

  1. select * from order_info where uid = 5837661 order by id asc limit 1 

執行 show create table order_info 發現這個表其實是有加索引的:

  1. CREATE TABLE `order_info` ( 
  2.   `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
  3.   `uid` int(11) unsigned, 
  4.   `order_status` tinyint(3) DEFAULT NULL
  5.   ... 省略其它字段和索引 
  6.   PRIMARY KEY (`id`), 
  7.   KEY `idx_uid_stat` (`uid`,`order_status`), 
  8. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 

理論上執行上述 SQL 會命中 idx_uid_stat 這個索引,但實際執行 explain 查看:

  1. explain select * from order_info where uid = 5837661 order by id asc limit 1 

可以看到它的 possible_keys(此 SQL 可能涉及到的索引) 是 idx_uid_stat,但實際上(key)用的卻是全表掃描。

我們知道 MySQL 是基于成本來選擇是基于全表掃描還是選擇某個索引來執行最終的執行計劃的,所以看起來是全表掃描的成本小于基于 idx_uid_stat 索引執行的成本。

不過我的第一感覺很奇怪,這條 SQL 雖然是回表,但它的 limit 是 1,也就是說只選擇了滿足 uid = 5837661 中的其中一條語句,就算回表也只回一條記錄,這種成本幾乎可以忽略不計,優化器怎么會選擇全表掃描呢。

為了查看 MySQL 優化器為啥選擇了全表掃描,我打開了 optimizer_trace 來一探究竟。

畫外音:在 MySQL 5.6 及之后的版本中,我們可以使用 optimizer trace 功能查看優化器生成執行計劃的整個過程。

使用 optimizer_trace 的具體過程如下:

  1. SET optimizer_trace="enabled=on";        // 打開 optimizer_trace 
  2. SELECT * FROM order_info where uid = 5837661 order by id asc limit 1 
  3. SELECT * FROM information_schema.OPTIMIZER_TRACE;    // 查看執行計劃表 
  4. SET optimizer_trace="enabled=off"; // 關閉 optimizer_trace 

MySQL 優化器首先會計算出全表掃描的成本,然后選出該 SQL 可能涉及到的所有索引并且計算索引的成本,然后選出所有成本最小的那個來執行。

來看下 optimizer trace 給出的關鍵信息:

  1.   "rows_estimation": [ 
  2.     { 
  3.       "table""`rebate_order_info`"
  4.       "range_analysis": { 
  5.         "table_scan": { 
  6.           "rows": 21155996, 
  7.           "cost": 4.45e6    // 全表掃描成本 
  8.         } 
  9.       }, 
  10.       ... 
  11.       "analyzing_range_alternatives": { 
  12.           "range_scan_alternatives": [ 
  13.           { 
  14.             "index""idx_uid_stat"
  15.             "ranges": [ 
  16.             "5837661 <= uid <= 5837661" 
  17.             ], 
  18.             "index_dives_for_eq_ranges"true
  19.             "rowid_ordered"false
  20.             "using_mrr"false
  21.             "index_only"false
  22.             "rows": 255918, 
  23.             "cost": 307103,            // 使用idx_uid_stat索引的成本 
  24.             "chosen"true 
  25.             } 
  26.           ], 
  27.        "chosen_range_access_summary": {    // 經過上面的各個成本比較后選擇的最終結果 
  28.          "range_access_plan": { 
  29.              "type""range_scan"
  30.              "index""idx_uid_stat",  // 可以看到最終選擇了idx_uid_stat這個索引來執行 
  31.              "rows": 255918, 
  32.              "ranges": [ 
  33.              "58376617 <= uid <= 58376617" 
  34.              ] 
  35.          }, 
  36.          "rows_for_plan": 255918, 
  37.          "cost_for_plan": 307103, 
  38.          "chosen"true 
  39.          } 
  40.          }   
  41.     ... 

可以看到全表掃描的成本是 4.45e6,而選擇索引 idx_uid_stat 的成本是 307103,遠小于全表掃描的成本。

而且從最終的選擇結果(chosen_range_access_summary)來看,確實也是選擇了 idx_uid_stat 這個索引。

但為啥從 explain 看到的選擇是執行 PRIMARY 也就是全表掃描呢,難道這個執行計劃有誤?

[[429009]]

仔細再看了一下這個執行計劃,果然發現了貓膩,執行計劃中有一個 reconsidering_access_paths_for_index_ordering 選擇引起了我的注意。

  1.     "reconsidering_access_paths_for_index_ordering": { 
  2.     "clause""ORDER BY"
  3.     "index_order_summary": { 
  4.       "table""`rebate_order_info`"
  5.       "index_provides_order"true
  6.       "order_direction""asc"
  7.       "index""PRIMARY",    // 可以看到選擇了主鍵索引 
  8.       "plan_changed"true
  9.       "access_type""index_scan" 
  10.         } 
  11.     } 

這個選擇表示由于排序的原因再進行了一次索引選擇優化,由于我們的 SQL 使用了 id 排序(order by id asc limit 1),優化器最終選擇了 PRIMARY 也就是全表掃描來執行。

也就是說這個選擇會無視之前的基于索引成本的選擇,為什么會有這樣的一個選項呢,主要原因如下:

The short explanation is that the optimizer thinks — or should I say hopes — that scanning the whole table (which is already sorted by the id field) will find the limited rows quick enough, and that this will avoid a sort operation. So by trying to avoid a sort, the optimizer ends-up losing time scanning the table.

從這段解釋可以看出主要原因是由于我們使用了 order by id asc 這種基于 id 的排序寫法,優化器認為排序是個昂貴的操作。

所以為了避免排序,并且它認為 limit n 的 n 如果很小的話即使使用全表掃描也能很快執行完。

所以它選擇了全表掃描,也就避免了 id 的排序(全表掃描其實就是基于 id 主鍵的聚簇索引的掃描,本身就是基于 id 排好序的)。

如果這個選擇是對的那也罷了,然而實際上這個優化卻是有 bug 的!實際選擇 idx_uid_stat 執行會快得多(只要 28 ms)!

網上有不少人反饋這個問題,而且出現這個問題基本只與 SQL 中出現 order by id asc limit n這種寫法有關,如果 n 比較小很大概率會走全表掃描,如果 n 比較大則會選擇正確的索引。

這個 bug 最早追溯到 2014 年,不少人都呼吁官方及時修正這個 bug,可能是實現比較困難,直到 MySQL 5.7,8.0 都還沒解決。

所以在官方修復前我們要盡量避免這種寫法,如果一定要用這種寫法,怎么辦呢,主要有兩種方案。

①使用 force index 來強制使用指定的索引,如下:

  1. select * from order_info force index(idx_uid_stat) where uid = 5837661 order by id asc limit 1 

這種寫法雖然可以,但不夠優雅,如果這個索引被廢棄了咋辦?于是有了第二種比較優雅的方案。

②使用 order by (id+0) 方案,如下:

  1. select * from order_info where uid = 5837661 order by (id+0) asc limit 1 

這種方案也可以讓優化器選擇正確的索引,更推薦!

為什么這個 trick 可以呢,因為此 SQL 雖然是按 id 排序的,但在 id 上作了加法這樣耗時的操作(雖然只是加個無用的 0,但足以騙過優化器),優化器認為此時基于全表掃描會更耗性能,于是會選擇基于成本大小的方式來選擇索引。

作者:坤哥,前獨角獸技術專家,現創業者,持續分享個人的成長收獲。

編輯:陶家龍 

出處:轉載自公眾號碼海(ID:seaofcode)

 

責任編輯:武曉燕 來源: 碼海
相關推薦

2021-09-25 13:05:10

MYSQL開發數據庫

2025-10-22 08:55:16

2025-04-14 09:31:03

2024-10-08 08:14:08

用戶生命周期分析服務

2022-07-15 08:20:54

Java基礎知識

2021-12-28 08:17:41

循環 forgo

2022-10-31 18:38:24

MySQL數據訂單表

2024-09-29 09:27:10

2024-09-27 09:31:25

2025-05-27 01:55:00

MySQL數據庫工具鏈

2025-11-18 01:33:00

2025-04-29 08:30:00

迭代器失效C++編程

2024-11-26 08:20:53

程序數據歸檔庫

2018-01-10 13:40:03

數據庫MySQL表設計

2025-04-03 12:30:00

C 語言隱式類型轉換代碼

2023-01-18 23:20:25

編程開發

2020-09-15 08:46:26

Kubernetes探針服務端

2022-07-26 09:34:23

監控系統

2025-05-27 08:45:00

2021-07-29 10:39:50

MySQLMySQL5.7MySQL8
點贊
收藏

51CTO技術棧公眾號

亚洲影视在线播放| 久久草av在线| 亚洲欧洲国产精品| 亚洲欧洲日本精品| 性xxxxfjsxxxxx欧美| 99精品欧美一区二区三区综合在线| 青青草原成人在线视频| 日本激情视频一区二区三区| 成人h动漫免费观看网站| 色综合色狠狠天天综合色| 一区二区免费电影| 天天操天天干天天干| 蜜臀av国产精品久久久久 | xxxxx日韩| 国产黄色精品网站| 国产成人综合精品| 久久综合加勒比| 日韩电影免费在线观看| 日韩av最新在线观看| 91pony九色| 成人勉费视频| 亚洲国产一二三| 一区二区三区欧美在线| 日本在线视频1区| 国产一区二区三区精品视频| 国产91免费看片| 日产欧产va高清| 亚洲a在线视频| 国产一区二区激情| 久久亚洲AV成人无码国产野外| 国产美女视频一区二区| 色视频欧美一区二区三区| 欧美中日韩在线| 黄色免费在线看| 中文字幕精品综合| 欧美激情一区二区三区在线视频| 精品人妻一区二区三区麻豆91| 麻豆精品一区二区三区| 日本人成精品视频在线| 尤物视频在线观看国产| 午夜精品久久| 久热在线中文字幕色999舞| 精品无码在线观看| 狠狠做深爱婷婷综合一区| 日韩精品欧美国产精品忘忧草| 午夜性福利视频| 亚洲午夜免费| 日韩午夜在线观看| 午夜免费视频网站| 国产一区二区高清在线| 欧美另类变人与禽xxxxx| 成人性生生活性生交12| 在线手机中文字幕| 香蕉影视欧美成人| 97久久国产亚洲精品超碰热 | 中文字幕一区av| 亚洲国产欧美日韩| 91短视频版在线观看www免费| 欧美激情一区二区三区不卡| 水蜜桃一区二区三区| 国产女人在线观看| 中文字幕成人在线观看| 亚洲欧洲日本国产| 黄色网在线免费观看| 亚洲欧洲av另类| 久久视频免费在线| 丝袜美腿av在线| 亚洲午夜影视影院在线观看| 成人免费在线网| 人在线成免费视频| 在线亚洲一区观看| 激情五月俺来也| 亚洲影视资源| 日韩美女主播在线视频一区二区三区 | 欧美xxxx免费虐| 亚洲午夜在线视频| 成年人黄色片视频| 久久精品超碰| 日韩欧美一二三区| 风间由美一二三区av片| 国产日产精品一区二区三区四区的观看方式 | 风间由美久久久| 天天操天天干天天爱| 国产日韩精品一区| 天天想你在线观看完整版电影免费| 午夜影院免费在线| 欧美视频在线观看免费| 在线观看国产中文字幕| 一本一道久久a久久| 精品调教chinesegay| 毛片视频免费播放| 亚洲视频精品| 国产精品高潮呻吟久久av野狼| 亚洲午夜精品久久久| 成人一区二区视频| 日韩欧美国产二区| 青青青国内视频在线观看软件| 日韩欧亚中文在线| 亚洲欧美天堂在线| 欧美日韩另类图片| www.欧美三级电影.com| 日韩av一二三区| 久久av中文字幕片| 久久精品国产第一区二区三区最新章节 | 国产精品素人视频| 国产九色porny| 亚洲精品777| 亚洲人成电影网站| 九九九在线视频| 日本午夜精品视频在线观看| 国产精品久久精品国产| 91女主播在线观看| 黑人极品videos精品欧美裸| 午夜视频在线网站| 国产精品欧美日韩一区| 欧美激情手机在线视频 | 悠悠资源网亚洲青| 欧美一区二区三级| 女人十八毛片嫩草av| 亚洲久久成人| 444亚洲人体| 亚洲xxxxxx| 色婷婷久久久亚洲一区二区三区| 日本黄色三级网站| 成人中文在线| 国产不卡av在线免费观看| 黄片毛片在线看| 亚洲欧美欧美一区二区三区| 簧片在线免费看| 日韩av资源网| 久久青草精品视频免费观看| 一级黄色大片免费观看| 久久精品亚洲乱码伦伦中文| 91专区在线观看| 福利片在线一区二区| 久久成人免费视频| 夜夜躁很很躁日日躁麻豆| 久久精品日产第一区二区三区高清版| 毛片在线视频播放| 牛牛影视久久网| 久久久久久久国产| 亚洲第一页综合| 一区二区激情小说| 永久看看免费大片| 欧美+日本+国产+在线a∨观看| 国产在线精品一区免费香蕉| 91精品国产综合久久久久久豆腐| 欧美亚洲动漫精品| 91精品久久久久久久久久久久| 久久伊人亚洲| 日本一区免费看| **欧美日韩在线观看| 亚洲无亚洲人成网站77777| 日本免费在线观看视频| 久久精品在线免费观看| www.四虎成人| 欧美色女视频| 国产精品网址在线| 99自拍视频在线观看| 欧美一卡2卡三卡4卡5免费| 欧美人与禽zozzo禽性配| 国产成人免费视频精品含羞草妖精| 国产卡一卡二在线| 中文一区二区三区四区| 欧美疯狂xxxx大交乱88av| 欧美特黄一级视频| 精品国产电影一区| 91视频免费在观看| 激情小说亚洲一区| 99久久久精品视频| 久久动漫网址| 国产z一区二区三区| 欧美jizz18hd性欧美| 日韩一区二区三区免费观看| 久久久国产精华液| 久久先锋影音av鲁色资源网| 精品久久久久久久无码| 91麻豆精品国产91久久久平台| 国产日韩换脸av一区在线观看| 成年人黄视频在线观看| 亚洲第一精品电影| 波多野结衣一本一道| 亚洲人123区| 日本一级片在线播放| 三级成人在线视频| 少妇久久久久久被弄到高潮| 欧美天堂影院| 国产欧美日韩中文字幕| 国产乱码在线| 国产一区二区三区视频| 国产三级小视频| 欧美日韩激情小视频| 三级影片在线观看| av在线不卡网| 色91精品久久久久久久久| 狠狠噜噜久久| 视频一区二区三| 9l视频自拍蝌蚪9l视频成人| 国产成人精品日本亚洲| 性欧美video高清bbw| 伊人久久男人天堂| 色欲av永久无码精品无码蜜桃| 欧美体内she精视频| 日本一区二区免费在线观看| 欧美韩日一区二区三区四区| 美女久久久久久久久| 美女一区二区视频| 波多野结衣乳巨码无在线| 国产精品97| 日韩精品不卡| 日韩极品少妇| 亚洲专区中文字幕| 国产一区二区三区四区五区3d| 国语对白做受69| gogo在线高清视频| 一区二区欧美日韩视频| 污视频网站在线播放| 欧美一区二区三区视频免费播放| 亚洲GV成人无码久久精品| 夜夜嗨av一区二区三区网页| 美国精品一区二区| 久久综合九色综合97_久久久| 亚洲色图欧美自拍| 麻豆成人久久精品二区三区小说| 国产男女无遮挡| 伊人久久大香线蕉综合热线| 欧美 另类 交| 大色综合视频网站在线播放| 欧美高清性xxxxhd| 老汉色老汉首页av亚洲| 国产精品夜夜夜一区二区三区尤| 91视频成人| 成人黄色中文字幕| a屁视频一区二区三区四区| 日本欧美一级片| 亚洲精品福利电影| 97视频在线观看视频免费视频| av色综合久久天堂av色综合在| 在线看福利67194| 草碰在线视频| 中日韩午夜理伦电影免费 | 久久的精品视频| 午夜小视频在线| 中文字幕欧美日韩精品| yiren22综合网成人| 中文字幕久热精品视频在线| 国产毛片av在线| 亚洲夜晚福利在线观看| 福利小视频在线观看| 亚洲最新视频在线| 二区三区在线| 中文字幕日韩欧美在线| 91欧美在线视频| 久久精品男人天堂| av大片在线| 国语自产精品视频在线看| 波多野结衣视频一区二区| 91av在线免费观看视频| 亚洲国产福利| 国产精品美女视频网站| 日韩成人综合网| 亚洲一区二区三区香蕉| 成人激情自拍| 久久精品日产第一区二区三区乱码| 台湾亚洲精品一区二区tv| 欧美日韩一区综合| 国产精品99一区二区三区| 韩国黄色一级大片| 亚洲一级网站| 日本一本二本在线观看| 蜜臀久久99精品久久久画质超高清| 天天看片天天操| 国产成人亚洲综合a∨猫咪| 国模私拍在线观看| 久久精品一区二区三区不卡牛牛| 黄色片网站在线播放| 亚洲激情自拍偷拍| 4438国产精品一区二区| 欧美狂野另类xxxxoooo| 成人毛片在线免费观看| 精品亚洲一区二区三区在线观看| 日本免费视频在线观看| 欧美精品久久久久a| 精品网站在线| 国产v亚洲v天堂无码| 亚洲日产av中文字幕| 香蕉视频在线网址| 亚洲一区黄色| 亚洲免费在线播放视频| 99久久久国产精品| 国产3级在线观看| 午夜精品免费在线| 一级做a爱片久久毛片| 亚洲第一页自拍| 日本中文字幕视频在线| 97香蕉超级碰碰久久免费软件| 成人午夜sm精品久久久久久久| 国产高清精品一区二区| 国产一区二区亚洲| 成人在线国产视频| 麻豆91精品视频| 人妻无码一区二区三区| 亚洲人午夜精品天堂一二香蕉| 五月婷婷亚洲综合| 欧美一区二区性放荡片| 国产在线观看高清视频| 欧美激情亚洲精品| 四虎影视国产精品| 日韩欧美精品久久| 国产日韩亚洲欧美精品| 俄罗斯女人裸体性做爰| 国产欧美一区二区精品久导航| 久久久久97国产| 欧美精品乱人伦久久久久久| 飘雪影院手机免费高清版在线观看| 欧美wwwxxxx| 99精品国自产在线| 欧美亚洲另类在线一区二区三区| 欧美日韩三级| 国产永久免费网站| 国产精品全国免费观看高清| 狠狠人妻久久久久久| 亚洲国产成人91精品| 中日韩高清电影网| 成人激情av在线| 色综合狠狠操| 国产视频手机在线播放| 久久久久久久久久看片| 日产欧产va高清| 欧美成人aa大片| 亚洲男同gay网站| 91社区国产高清| 婷婷色综合网| 在线看免费毛片| 综合久久久久久久| 在线观看av大片| 永久免费毛片在线播放不卡| 日本久久免费| 欧美日韩综合网| 日日夜夜精品免费视频| 亚洲一区二区三区蜜桃| 色狠狠综合天天综合综合| 色鬼7777久久| 日韩av免费一区| 欧美精品尤物在线观看| 国产日韩成人内射视频 | 亚洲韩国欧洲国产日产av| 波多野结依一区| 国产自产在线视频一区| aa国产精品| 久久国产精品无码一级毛片| 婷婷成人激情在线网| 日韩欧美在线番号| 国产盗摄xxxx视频xxx69| 欧美少妇xxxx| 做a视频在线观看| 亚洲精品精品亚洲| 深爱五月激情五月| 91精品国产精品| 黄色不卡一区| av免费一区二区| 亚洲一区二区在线免费观看视频 | 99久久精品情趣| 亚洲s码欧洲m码国产av| 中文字幕国产日韩| www 久久久| 福利视频一二区| 国产网站一区二区三区| 亚洲无码精品在线观看| 欧美成人精品一区二区| 欧美激情极品| 国产原创精品在线| 亚洲精品中文在线| 日日夜夜精品免费| 国产国产精品人在线视| 中文一区一区三区免费在线观看| 欧美日韩一区二区三区四区五区六区| 五月激情六月综合| 免费在线看黄网站| 国产欧美亚洲日本| 蜜臀国产一区二区三区在线播放| 日本黄色小说视频| 精品亚洲国产成av人片传媒| 国产激情久久| 久久亚洲精品无码va白人极品| 久久久无码精品亚洲日韩按摩| 中文字幕一区二区人妻| 欧美精品18videos性欧美| 国内亚洲精品| 在线中文字日产幕| 欧美亚洲国产一卡| 国产美女高潮在线| 一区不卡字幕| 99国产精品国产精品毛片| 在线观看一二三区| 国产69精品久久久久99| 久久国产亚洲| 18禁裸乳无遮挡啪啪无码免费| 91精品国产一区二区三区 | 亚洲国产导航|