国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > MySQL > 正文

分析一個(gè)MySQL的異常查詢的案例

2024-07-24 12:46:15
字體:
供稿:網(wǎng)友

問題

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

隱藏用戶表信息,語句及結(jié)果如下

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;

執(zhí)行時(shí)間3 min 3.65 sec

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;

執(zhí)行時(shí)間1.24Sec.

性能差距非常大!

分析
MySQL Tips:追查語句執(zhí)行時(shí)最常用的方法,是通過explain來看語句的執(zhí)行計(jì)劃。 ?

更有沖擊性的效果是通過縮小范圍后,在這個(gè)數(shù)據(jù)下,limit 67和limit 68的執(zhí)行計(jì)劃相差很大。

兩個(gè)執(zhí)行計(jì)劃:

LIMIT 67id: 1select_type: SIMPLEtable: atype: rangepossible_keys: A,B,Ckey: Bkey_len: 387ref: NULLrows: 2555192Extra: Using where; Using temporary; Using filesort1 row in set (0.00 sec)LIMIT 68id: 1select_type: SIMPLEtable: atype: refpossible_keys: A,B,Ckey: Akey_len: 3ref: constrows: 67586Extra: Using where; Using temporary; Using filesort1 row in set (0.00 sec)

可以看到,兩個(gè)語句的執(zhí)行計(jì)劃不同:使用的索引不同。

MySQL Tips:explain的結(jié)果中,key表示最終使用的索引,rows表示使用這個(gè)索引需要掃描的行數(shù),這是個(gè)估計(jì)值。

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

一個(gè)確認(rèn)

雖然rows是估計(jì)值,但是指導(dǎo)索引使用的依據(jù)。既然limit 68能達(dá)到rows 67586,說明在第一個(gè)語句優(yōu)化器可選結(jié)果中,也應(yīng)該有此值,為什么不會(huì)選擇索引A?
先確認(rèn)一下我們上面的這個(gè)結(jié)論。

MySQL Tips:MySQL語法中能夠用force index 來強(qiáng)行要求優(yōu)化器使用某一個(gè)索引。

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/Gid: 1select_type: SIMPLEtable: atype: refpossible_keys:Akey: Akey_len: 3ref: constrows: 67586Extra: Using where; Using temporary; Using filesort1 row in set (0.00 sec)

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

MySQL Tips:MySQL優(yōu)化器會(huì)對(duì)possiable_key中的每個(gè)可能索引都計(jì)算查詢代價(jià),選擇最小代價(jià)的查詢計(jì)劃。

至此我們大概可以猜測,這個(gè)應(yīng)該是MySQL實(shí)現(xiàn)上的bug:沒有選擇合適的索引,導(dǎo)致使用了明顯錯(cuò)誤的執(zhí)行計(jì)劃。

MySQL Tips:MySQL的優(yōu)化器執(zhí)行期間需要依賴于表的統(tǒng)計(jì)信息,而統(tǒng)計(jì)信息是估算值,因此有可能導(dǎo)致得到的執(zhí)行計(jì)劃非最優(yōu)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 红河县| 玛多县| 通许县| 凤翔县| 藁城市| 张北县| 策勒县| 禹城市| 周宁县| 南宫市| 蓬溪县| 宝坻区| 门头沟区| 巩义市| 离岛区| 东港市| 张家口市| 湘阴县| 商城县| 海林市| 杭州市| 高阳县| 铜梁县| 卢湾区| 鄯善县| 鄄城县| 册亨县| 清新县| 额尔古纳市| 桃园市| 南丰县| 南澳县| 简阳市| 武定县| 且末县| 桃园县| 泾源县| 绍兴市| 保靖县| 通渭县| 建阳市|