亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > MySQL > 正文

分析一個MySQL的異常查詢的案例

2024-07-24 13:07:04
字體:
來源:轉載
供稿:網友

這篇文章主要介紹了分析一個MySQL的異常查詢的案例,主要是針對索引方面的操作問題,需要的朋友可以參考下

問題

用戶工單疑問:相同的語句,只是最后的limit行數不同。奇怪的是,limit 10 的性能比limit 100的語句還慢約10倍。

隱藏用戶表信息,語句及結果如下

 

 
  1. SELECT f1 , SUM(`f2`) `CNT` FROM T WHERE f1 IS NOT NULL AND f3 = '2014-05-12' GROUP BY f1 ORDER BY `CNT` DESC LIMIT 10; 

執行時間3 min 3.65 sec

 

 
  1. SELECT f1 , SUM(`f2`) `CNT` FROM T WHERE f1 IS NOT NULL AND f3 = '2014-05-12' GROUP BY f1 ORDER BY `CNT` DESC LIMIT 100; 

執行時間1.24Sec.

性能差距非常大!

分析

MySQL Tips:追查語句執行時最常用的方法,是通過explain來看語句的執行計劃。 ?

更有沖擊性的效果是通過縮小范圍后,在這個數據下,limit 67和limit 68的執行計劃相差很大。

兩個執行計劃:

 

 
  1. LIMIT 67 
  2. id: 1 
  3. select_type: SIMPLE 
  4. table: a 
  5. type: range 
  6. possible_keys: A,B,C 
  7. key: B 
  8. key_len: 387 
  9. ref: NULL 
  10. rows: 2555192 
  11. Extra: Using where; Using temporary; Using filesort 
  12. 1 row in set (0.00 sec) 
  13.  
  14. LIMIT 68 
  15. id: 1 
  16. select_type: SIMPLE 
  17. table: a 
  18. type: ref 
  19. possible_keys: A,B,C 
  20. key: A 
  21. key_len: 3 
  22. ref: const 
  23. rows: 67586 
  24. Extra: Using where; Using temporary; Using filesort 
  25. 1 row in set (0.00 sec) 

可以看到,兩個語句的執行計劃不同:使用的索引不同。

MySQL Tips:explain的結果中,key表示最終使用的索引,rows表示使用這個索引需要掃描的行數,這是個估計值。

表中 索引A定義為 (f3, f4, f1, f2, f5); 索引B定義為(f1, f2, f3);

一個確認

雖然rows是估計值,但是指導索引使用的依據。既然limit 68能達到rows 67586,說明在第一個語句優化器可選結果中,也應該有此值,為什么不會選擇索引A?

先確認一下我們上面的這個結論。

MySQL Tips:MySQL語法中能夠用force index 來強行要求優化器使用某一個索引。

 

 
  1. Explain SELECT f1 , SUM(f2) CNT FROM t force index(A) WHERE f1 IS NOT NULL AND f3 = ‘2014-05-12' GROUP BY P ORDER BY CNT DESC LIMIT 67/G 
  2.  
  3. id: 1 
  4. select_type: SIMPLE 
  5. table: a 
  6. type: ref 
  7. possible_keys:A 
  8. key: A 
  9. key_len: 3 
  10. ref: const 
  11. rows: 67586 
  12. Extra: Using where; Using temporary; Using filesort 
  13. 1 row in set (0.00 sec) 

順便說明,由于我們指定了force index,因此優化器不會考慮其他索引,possible_keys里只會顯示A。我們關注的是rows:67586。這說明在limit 67語句里,使用索引A也能夠減少行掃描。

MySQL Tips:MySQL優化器會對possiable_key中的每個可能索引都計算查詢代價,選擇最小代價的查詢計劃。

至此我們大概可以猜測,這個應該是MySQL實現上的bug:沒有選擇合適的索引,導致使用了明顯錯誤的執行計劃。

MySQL Tips:MySQL的優化器執行期間需要依賴于表的統計信息,而統計信息是估算值,因此有可能導致得到的執行計劃非最優。

但要說明的是,上述Tip是客觀情況造成(可接受),但本例卻是例外,因此優化器實際上可以拿到能夠作出選擇正確結果的數據(rows值),但是最終選擇錯誤。

原因分析

MySQL優化器是按照查詢代價的估算值,來確定要使用的索引。計算這個估算值的過程,基本是按照“估計需要掃描的行數”來確定的。

MySQL Tips:MySQL在目前集團主流使用的5.1和5.5版本中只能使用前綴索引。

因此,使用索引A只能用上字段f3,使用索引B只能用上字段f1。Rows即為使用了索引查到上下界,之后需要掃描的數據行數(估算值)。

上述的語句需要用到group和order by,因此執行計劃中都有Using temporary; Using filesort。

流程上按順序先計算使用索引A的查詢代價。

之后依次計算其他possitabe_key的查詢代價。由于過程中需要排序,在得到一個暫定結果后,需要判斷是否有代價更低的排序方式(test_if_cheaper_ordering)。

與之前的大同小異,也是依靠估計掃描行數來計算代價。

在這個邏輯的實現過程中,存在一個bug:在估計當前索引的區分度的時候,沒有考慮到前綴索引。

即:假設表中有50w行數據,索引B(f1,f2,f3),則計算索引區分度時,需要根據能夠用上的前綴部分來確定。比如f1有1000個不同的值,則平均每個key值上的記錄數為500.如(f1,f2)有10000個同的值,則平均每個組合key上的記錄數為50,若(f1,f2,f3)有50w個不同的值,則平均每個組合key上的記錄數為1。

MySQL Tips:每個key上的記錄數越少,說明使用該索引查詢時效率最高。對應于show index from tbl 輸出結果中的Cardinality值越大。

在這個case下,索引B只能使用f1做前綴索引,但是在計算單key上的行平均值時用的是(f1,f2,f3),這就導致估算用索引B估算的時候,得到的代價偏小。導致誤選。

回到問題本身

1、 為什么limit值大的時候反而選對了呢?

這是因為在計算B的查詢代價時,查詢需要返回的行數limit_rows也參與乘積,若limit值較大,則計算出來的B的代價就會更大,反而會由于代價。值超過A,而導致優化器最終選擇A。

2、 這個表有50w行數就,為什么limit相差為就差別這么大?

這與語句本身有關。這個語句中有group by,這就意味著每多limit一個值,實際上需要掃描更多的行N。 這里N為“表的總行數”/“表中不同的f2值”。

也就是說這個語句使得這個bug有放大作用。

解決方案

分析清楚后解決方法就比較簡單了,修改代碼邏輯,在執行test_if_cheaper_ordering過程中,改用字段f1的區分度來計算即可。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品网站大全| 亚洲天堂2020| 欧美成人精品在线视频| 国产亚洲视频在线观看| 国产精品亚洲美女av网站| 中文字幕亚洲欧美日韩2019| 久热精品视频在线观看一区| 色狠狠久久aa北条麻妃| 国产精品99久久久久久www| 久久天天躁日日躁| 欧美日韩综合视频| 欧美精品福利视频| 自拍亚洲一区欧美另类| 在线观看精品自拍私拍| 久久综合网hezyo| 日韩电影大片中文字幕| 国产成人精品免高潮在线观看| 日韩在线免费高清视频| 91亚洲国产精品| 午夜精品一区二区三区视频免费看| 中文字幕无线精品亚洲乱码一区| 欧美亚州一区二区三区| 日本高清视频精品| 欧美激情女人20p| 91精品免费看| 日韩精品福利网站| 亚洲人成在线免费观看| 亚洲自拍偷拍色图| 亚洲国产日韩欧美在线99| 日韩中文在线中文网在线观看| 欧亚精品中文字幕| 亚洲视频第一页| 国产视频久久网| 欧美激情按摩在线| 欧美日本在线视频中文字字幕| 色综合老司机第九色激情| 成人av在线天堂| 久久99亚洲精品| 美女av一区二区三区| 成年人精品视频| 亚洲美女av黄| 成人www视频在线观看| 国产高清在线不卡| 在线观看欧美日韩| 久久国内精品一国内精品| 欧美精品久久久久久久| 中文在线资源观看视频网站免费不卡| 亚洲欧美一区二区精品久久久| 日韩精品高清在线观看| 热久久免费国产视频| 中文字幕精品一区久久久久| 亚洲色图35p| 黄色一区二区在线观看| 久久久久久综合网天天| 久久久久久久久久久久久久久久久久av| xvideos亚洲人网站| 亚洲综合在线中文字幕| 精品女厕一区二区三区| 国产精品久久久久久久久免费看| 精品成人av一区| 亚洲视频在线观看视频| 亚洲18私人小影院| 91日韩在线视频| 欧美大胆a视频| 国产精品欧美日韩一区二区| 国产日韩精品在线| 97在线视频精品| 久久久噜噜噜久久| 亚洲va久久久噜噜噜久久天堂| 日韩av在线直播| 色一情一乱一区二区| 国产欧美在线视频| 欧美成人一区二区三区电影| 亚洲第一国产精品| 国产做受高潮69| 国产精品人人做人人爽| 青青精品视频播放| 91精品视频大全| 最近2019中文字幕在线高清| 欧美在线观看网站| 一区二区福利视频| 日韩精品一区二区三区第95| 亚洲直播在线一区| 亚洲欧洲视频在线| 国产在线98福利播放视频| 日韩电影免费观看中文字幕| 久久久久久久久国产| 亚洲aⅴ日韩av电影在线观看| 日产精品久久久一区二区福利| 日韩精品极品在线观看播放免费视频| 欧美日韩激情视频8区| 色偷偷91综合久久噜噜| 欧美在线视频观看| 国产精品入口免费视频一| 浅井舞香一区二区| 成人xvideos免费视频| 日韩亚洲欧美中文高清在线| 欧美性xxxxx极品| 国产精品偷伦免费视频观看的| 不卡毛片在线看| 91网站免费看| 欧美国产欧美亚洲国产日韩mv天天看完整| 亚洲乱码国产乱码精品精天堂| 国产精品亚洲自拍| 欧美日韩福利视频| 麻豆国产精品va在线观看不卡| 精品调教chinesegay| 亚洲精品一区在线观看香蕉| 日韩的一区二区| 国产视频综合在线| 久久精品国产99国产精品澳门| 日韩成人久久久| 国产主播在线一区| 日韩美女免费视频| 亚洲成人精品久久久| 色综合久久天天综线观看| 45www国产精品网站| 日韩电影中文字幕在线| 国产欧美日韩最新| 欧美韩日一区二区| 亚洲人成绝费网站色www| 国内精品久久久久久影视8| 高清日韩电视剧大全免费播放在线观看| 高清一区二区三区四区五区| 久久伊人精品视频| 久久网福利资源网站| 91性高湖久久久久久久久_久久99| 国产精品永久免费| 久久久久免费视频| 国产精品久久一| 国产精品丝袜视频| 欧美性猛交xxxx黑人猛交| 日韩av电影在线免费播放| 成人免费淫片aa视频免费| 中文字幕国产精品| 一区二区国产精品视频| 北条麻妃久久精品| 久久国产精品久久久久| 久久久视频在线| 精品露脸国产偷人在视频| 欧美日在线观看| 国产三级精品网站| 国产精品一区二区电影| 一区二区三区国产在线观看| 国产噜噜噜噜久久久久久久久| 国产精品揄拍500视频| 日韩美女av在线免费观看| 日韩女在线观看| 5566日本婷婷色中文字幕97| 亚洲第一区中文99精品| 伊人伊成久久人综合网小说| 日韩专区在线观看| 色爱av美腿丝袜综合粉嫩av| 日韩黄在线观看| 国产suv精品一区二区三区88区| 日本不卡免费高清视频| 久久99亚洲热视| 伊人久久精品视频| 亚洲老司机av| 亚洲成人aaa| 国产精品午夜一区二区欲梦| 国产精品久久久久久久久久久不卡| 狠狠色噜噜狠狠狠狠97| 国产精品一区二区久久|