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

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

記一次因線上mysql優(yōu)化器誤判引起慢查詢事件

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

前言:

     收到瘋狂的慢查詢及請(qǐng)求超時(shí)報(bào)警,通過metrics分析出來自mysql請(qǐng)求的異常,cli —> show proceslist 看到很多慢查詢。 先前該sql是沒有的,后面因?yàn)閿?shù)據(jù)量的增長才出現(xiàn)了這問題。 雖然feeds表大到一個(gè)億,但因?yàn)閒eeds流信息有近期熱的特征,所以不是因?yàn)?innodb_buffer_pool_size 低效引起的io頻繁。 后來經(jīng)過進(jìn)一步explain執(zhí)行計(jì)劃分析得出了原因,mysql查詢優(yōu)化器選擇了他認(rèn)為高效的索引。

mysql查詢優(yōu)化器大多數(shù)情況是靠譜的!  但是你的sql語言含有多個(gè)索引時(shí)就要注意了,往往最后的結(jié)果令人有些彷徨了。因?yàn)閙ysql同一個(gè)sql只能使用一個(gè)索引,那么選擇哪個(gè)呢? 在數(shù)據(jù)量小時(shí)候,mysql優(yōu)化器會(huì)把主鍵索引后置,優(yōu)先使用 index和unique 。 當(dāng)你達(dá)到一個(gè)數(shù)據(jù)量級(jí)后,又因?yàn)槟愕牟樵儾僮饔?in ,那么mysql查詢優(yōu)化器很可能會(huì)選用主鍵的 !

記住一句話,mysql查詢優(yōu)化是基于檢索成本考慮,而不是基于時(shí)間成本考慮。 優(yōu)化器是根據(jù)現(xiàn)有的數(shù)據(jù)狀態(tài)來推算代價(jià),而不是真的去執(zhí)行一遍sql.

所以,mysql優(yōu)化器并不是每次都可以達(dá)到優(yōu)化的效果的。 它并不能準(zhǔn)確預(yù)估代價(jià),如果要準(zhǔn)確得到走各個(gè)索引的代價(jià)就要去真的執(zhí)行一遍才能知道,所以代價(jià)分析只是做了一個(gè)預(yù)估,既然是預(yù)估那么就有誤判。

我們這里說的表是feed信息流表,我們知道feeds信息流表訪問不僅頻繁,而且數(shù)據(jù)量也很大。 但是這個(gè)表的數(shù)據(jù)結(jié)構(gòu)很簡單,索引也簡單.   一共就兩個(gè)索引,一個(gè)是主鍵索引, 一個(gè)是unique唯一鍵索引。

如下,該表的量級(jí)已經(jīng)到億級(jí)別了,因?yàn)橛凶銐蚨嗟腸ache前頂,又因?yàn)檫@樣那樣的原因,所以沒來的及做分庫分表。

問題是這樣的, 當(dāng)數(shù)據(jù)量級(jí)不到一個(gè)億的時(shí)候,mysql優(yōu)化器選擇使用 index索引, 當(dāng)數(shù)據(jù)量級(jí)超過一個(gè)億后,mysql查詢優(yōu)化器選擇使用 主鍵索引了。  這樣帶來的問題就是 查詢速度太慢。

這是正常情況下:

mysql> explain SELECT * FROM `feed` WHERE user_id IN (116537309,116709093,116709377) AND cid IN (1001,1005,1054,1092,1093,1095) AND id <= 128384713 ORDER BY id DESC LIMIT 0, 11 /G;*************************** 1. row *************************** id: 1 select_type: SIMPLE table: feed partitions: NULL type: rangepossible_keys: PRIMARY,feed_user_target key: feed_user_target key_len: 6 ref: NULL rows: 18 filtered: 50.00 Extra: Using where; Using index; Using filesort1 row in set, 1 warning (0.00 sec)

同樣的sql語句,在數(shù)據(jù)量有較大變化后,mysql查詢優(yōu)化器對(duì)索引的選擇也有了變化。

mysql> explain SELECT * FROM `feed` WHERE user_id IN (116537309,116709093,116709377) AND cid IN (1001,1005,1054,1092,1093,1095) AND id <= 128384713 ORDER BY id DESC LIMIT 0, 11 /G;*************************** 1. row *************************** id: 1 select_type: SIMPLE table: feed type: rangepossible_keys: PRIMARY,feed_user_target key: PRIMARY key_len: 4 ref: NULL rows: 11873197 Extra: Using where1 row in set (0.00 sec)
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 镶黄旗| 永胜县| 张北县| 大宁县| 武平县| 迁西县| 临沧市| 本溪市| 四川省| 大宁县| 高邮市| 得荣县| 武定县| 江油市| 新野县| 铜梁县| 会理县| 崇礼县| 东平县| 无极县| 都兰县| 安溪县| 昆明市| 长岭县| 昭平县| 涟源市| 柞水县| 乐陵市| 柘城县| 新田县| 德阳市| 将乐县| 平远县| 西乌珠穆沁旗| 萝北县| 天气| 宁乡县| 贵南县| 贵南县| 奎屯市| 台东市|