亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時(shí)間:2017年02月26日 10:03:22   作者:rfyiamcool  
這篇文章主要介紹了記一次因線上mysql優(yōu)化器誤判引起慢查詢事件的相關(guān)資料以及最終的解決方案,分享給大家,希望能夠給大家一點(diǎn)啟發(fā)。

前言:

     收到瘋狂的慢查詢及請(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: 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語句,在數(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: 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,強(qiáng)制查詢優(yōu)化器使用我們給出的index 。 我這里是python開發(fā)環(huán)境,常見的python orm都有force index,ignore index,user index 參數(shù)的。

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

那么我們應(yīng)該怎么預(yù)防這種 因?yàn)閿?shù)據(jù)的增進(jìn),mysql優(yōu)化器選擇了一個(gè)低效索引的問題呢?

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

我自己對(duì)于mysql優(yōu)化器選擇索引規(guī)則一知半解的,后面準(zhǔn)備花時(shí)間好好研究下規(guī)則

相關(guān)文章

  • 解析mysql修改為utf8后仍然有亂碼的問題

    解析mysql修改為utf8后仍然有亂碼的問題

    本篇文章是對(duì)mysql修改為utf8后仍然有亂碼的問題進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • MySQL中查詢字段為空或者為null的方法

    MySQL中查詢字段為空或者為null的方法

    這篇文章主要介紹了MySQL中查詢字段為空或者為null的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • MySQL刪除數(shù)據(jù),表文件大小依然沒變的原因

    MySQL刪除數(shù)據(jù),表文件大小依然沒變的原因

    這篇文章主要介紹了MySQL刪除數(shù)據(jù),表文件大小依然沒變的原因,幫助大家更好的理解MySQL中的數(shù)據(jù)表,感興趣的朋友可以了解下
    2020-10-10
  • MySql 5.7.20安裝及data和my.ini文件的配置

    MySql 5.7.20安裝及data和my.ini文件的配置

    本文通過圖文并茂的形式給大家介紹了MySql 5.7.20安裝及data和my.ini文件的配置方法,本文給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2017-11-11
  • 詳解Mysql基礎(chǔ)語法的使用

    詳解Mysql基礎(chǔ)語法的使用

    MySQL是一個(gè)關(guān)系型數(shù)據(jù)庫管理系統(tǒng),由瑞典MySQL AB 公司開發(fā),目前屬于 Oracle 旗下產(chǎn)品。這篇文章主要介紹了Mysql基礎(chǔ)語法的使用,需要的朋友可以參考下
    2018-07-07
  • 深入理解mysql的自連接和join關(guān)聯(lián)

    深入理解mysql的自連接和join關(guān)聯(lián)

    這篇文章主要給大家介紹了關(guān)于mysql的自連接和join關(guān)聯(lián)的相關(guān)資料,文中介紹的非常詳細(xì),相信對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來一起看看吧。
    2017-04-04
  • MySQL 獲得當(dāng)前日期時(shí)間 函數(shù)

    MySQL 獲得當(dāng)前日期時(shí)間 函數(shù)

    這篇文章主要介紹了MySQL 獲得當(dāng)前日期時(shí)間 函數(shù) 非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-07-07
  • MySQL使用B+Tree當(dāng)索引的優(yōu)勢(shì)有哪些

    MySQL使用B+Tree當(dāng)索引的優(yōu)勢(shì)有哪些

    這篇文章主要介紹了MySQL使用B+Tree當(dāng)索引有哪些優(yōu)勢(shì),幫助大家更好的理解和學(xué)習(xí)使用MySQL,感興趣的朋友可以了解下
    2021-03-03
  • MySQL觸發(fā)器概念、原理與用法詳解

    MySQL觸發(fā)器概念、原理與用法詳解

    這篇文章主要介紹了MySQL觸發(fā)器概念、原理與用法,結(jié)合實(shí)例形勢(shì)詳細(xì)分析了mysql觸發(fā)器相關(guān)概念、原理、創(chuàng)建、用法及操作注意事項(xiàng),需要的朋友可以參考下
    2019-07-07
  • 關(guān)于MySQL存取圖片的三種方式(含源碼示例)

    關(guān)于MySQL存取圖片的三種方式(含源碼示例)

    最近在做小程序的后臺(tái),要求將小程序用戶以u(píng)pload方法上傳的圖片保存到mysql數(shù)據(jù)庫中,然后機(jī)緣巧合三種方式都試了,所以專門整理出來分享給大家,可能有的地方說的不太對(duì),歡迎大家?guī)图m正,需要的朋友可以參考下
    2024-04-04

最新評(píng)論