婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 記一次因線上mysql優化器誤判引起慢查詢事件

記一次因線上mysql優化器誤判引起慢查詢事件

熱門標簽:電銷機器人市場價 趙縣地圖標注 永州智能外呼系統 地圖標注直通車 遂寧400電話申請 哈爾濱云外呼系統運營商 dq8 全地圖標注 邯鄲400電話注冊辦理 南寧智能電銷機器人價格

前言:

     收到瘋狂的慢查詢及請求超時報警,通過metrics分析出來自mysql請求的異常,cli —> show proceslist 看到很多慢查詢。 先前該sql是沒有的,后面因為數據量的增長才出現了這問題。 雖然feeds表大到一個億,但因為feeds流信息有近期熱的特征,所以不是因為 innodb_buffer_pool_size 低效引起的io頻繁。 后來經過進一步explain執行計劃分析得出了原因,mysql查詢優化器選擇了他認為高效的索引。

mysql查詢優化器大多數情況是靠譜的!  但是你的sql語言含有多個索引時就要注意了,往往最后的結果令人有些彷徨了。因為mysql同一個sql只能使用一個索引,那么選擇哪個呢? 在數據量小時候,mysql優化器會把主鍵索引后置,優先使用 index和unique 。 當你達到一個數據量級后,又因為你的查詢操作有 in ,那么mysql查詢優化器很可能會選用主鍵的 !

記住一句話,mysql查詢優化是基于檢索成本考慮,而不是基于時間成本考慮。 優化器是根據現有的數據狀態來推算代價,而不是真的去執行一遍sql.

所以,mysql優化器并不是每次都可以達到優化的效果的。 它并不能準確預估代價,如果要準確得到走各個索引的代價就要去真的執行一遍才能知道,所以代價分析只是做了一個預估,既然是預估那么就有誤判。

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

如下,該表的量級已經到億級別了,因為有足夠多的cache前頂,又因為這樣那樣的原因,所以沒來的及做分庫分表。

問題是這樣的, 當數據量級不到一個億的時候,mysql優化器選擇使用 index索引, 當數據量級超過一個億后,mysql查詢優化器選擇使用 主鍵索引了。  這樣帶來的問題就是 查詢速度太慢。

這是正常情況下:

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: range
possible_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 filesort
1 row in set, 1 warning (0.00 sec)

同樣的sql語句,在數據量有較大變化后,mysql查詢優化器對索引的選擇也有了變化。

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: range
possible_keys: PRIMARY,feed_user_target
     key: PRIMARY
   key_len: 4
     ref: NULL
     rows: 11873197
    Extra: Using where
1 row in set (0.00 sec)

那么解決方法是使用 force index,強制查詢優化器使用我們給出的index 。 我這里是python開發環境,常見的python orm都有force index,ignore index,user index 參數的。

explain  SELECT * FROM `feed` force index (feed_user_target) WHERE user_id IN (116537309,116709093,116709377) ...

那么我們應該怎么預防這種 因為數據的增進,mysql優化器選擇了一個低效索引的問題呢?

針對這個問題請教了幾個廠的dba,得到的答案和我們的方法是一樣的。 都是只能通過后期的慢查詢來發現問題,然后在sql語句中指定force index來解決索引問題。 另外,在系統上線初期就會做這類問題的規避,但往往業務開發人員初期都會配合dba們的審查工作,但后期為了省事,或者說自以為是認為沒有問題,所以造成了 mysql查詢事故。

我自己對于mysql優化器選擇索引規則一知半解的,后面準備花時間好好研究下規則

您可能感興趣的文章:
  • mysql慢查詢優化之從理論和實踐說明limit的優點
  • 通過MySQL慢查詢優化MySQL性能的方法講解
  • 簡單談談MySQL優化利器-慢查詢
  • MySQL慢查詢優化之慢查詢日志分析的實例教程
  • 美團網技術團隊分享的MySQL索引及慢查詢優化教程
  • Mysql慢查詢優化方法及優化原則

標簽:上海 中衛 南寧 定西 張家界 浙江 阿里 鄂州

巨人網絡通訊聲明:本文標題《記一次因線上mysql優化器誤判引起慢查詢事件》,本文關鍵詞  記,一次,因,線上,mysql,優化,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《記一次因線上mysql優化器誤判引起慢查詢事件》相關的同類信息!
  • 本頁收集關于記一次因線上mysql優化器誤判引起慢查詢事件的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 灵武市| 正定县| 娄烦县| 禄劝| 开平市| 庆阳市| 东平县| 岐山县| 大埔区| 巴中市| 霸州市| 莲花县| 怀安县| 陕西省| 东阿县| 东至县| 全椒县| 五家渠市| 龙泉市| 广灵县| 黄大仙区| 宣化县| 柳江县| 西畴县| 嘉禾县| 林周县| 广东省| 涿鹿县| 岢岚县| 永安市| 北碚区| 西安市| 遵义市| 宁明县| 北辰区| 松江区| 花莲县| 甘洛县| 华蓥市| 汉阴县| 华安县|