mysql實戰(zhàn)(十)mysql選錯索引怎么辦

選錯索引的原因

選擇索引是優(yōu)化器的工作摔刁。而優(yōu)化器選擇索引的目的瓤荔,是找到一個最優(yōu)的執(zhí)行方案净蚤,并用最小的代價去執(zhí)行語句。在數(shù)據(jù)庫里面输硝,掃描行數(shù)是影響執(zhí)行代價的因素之一塞栅。掃描的行數(shù)越少,意味著訪問磁盤數(shù)據(jù)的次數(shù)越少腔丧,消耗的 CPU 資源越少放椰。

當然,掃描行數(shù)并不是唯一的判斷標準愉粤,優(yōu)化器還會結(jié)合是否使用臨時表砾医、是否排序,是否需要回表查詢等因素進行綜合判斷衣厘。

新建一張表

CREATE TABLE `t` (
  `id` int(11) NOT NULL,
  `a` int(11) DEFAULT NULL,
  `b` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `a` (`a`),
  KEY `b` (`b`)
) ENGINE=InnoDB如蚜;

然后压恒,我們往表 t 中插入 10 萬行記錄,取值按整數(shù)遞增错邦,即:(1,1,1)探赫,(2,2,2),(3,3,3) 直到 (100000,100000,100000)撬呢。執(zhí)行如下語句:

看一個例子:

mysql> select * from t where (a between 1 and 1000)  and (b between 50000 and 100000) order by b limit 1;

從條件上看伦吠,這個查詢沒有符合條件的記錄,因此會返回空集合魂拦。如果你來選擇索引毛仪,會選擇哪一個呢?

如果使用索引 a 進行查詢芯勘,那么就是掃描索引 a 的前 1000 個值箱靴,然后取到對應(yīng)的 id,再到主鍵索引上去查出每一行荷愕,然后根據(jù)字段 b 來過濾衡怀。顯然這樣需要掃描 1000 行。

如果使用索引 b 進行查詢安疗,那么就是掃描索引 b 的最后 50001 個值狈癞,與上面的執(zhí)行過程相同,也是需要回到主鍵索引上取值再判斷茂契,所以需要掃描 50001 行蝶桶。所以你一定會想,如果使用索引 a 的話掉冶,執(zhí)行速度明顯會快很多真竖。那么,下面我們就來看看到底是不是這么一回事兒厌小。

通過explain命令查看語句執(zhí)行情況

使用 explain 命令查看語句執(zhí)行情況

key的這一列恢共,表示的是優(yōu)化器選擇的索引列¤笛牵可以看到讨韭,返回結(jié)果中 key 字段顯示,這次優(yōu)化器選擇了索引 b癣蟋,而 rows 字段顯示需要掃描的行數(shù)是 50198透硝。

這里優(yōu)化器選擇使用索引 b,是因為它認為使用索引 b 可以避免排序(b 本身是索引疯搅,已經(jīng)是有序的了濒生,如果選擇索引 b 的話,不需要再做排序幔欧,只需要遍歷)罪治,所以即使掃描行數(shù)多丽声,也判定為代價更小。

解決方法

對于由于索引統(tǒng)計信息不準確導致的問題觉义,通過analyze table tableName命令雁社,可以重新統(tǒng)計索引信息,這個可以解決大部分情況的問題晒骇。使用之后再次使用explain命令查看霉撵。

而對于其他優(yōu)化器誤判的情況,可以在應(yīng)用端用 force index 來強行指定索引厉碟,也可以通過修改語句來引導優(yōu)化器喊巍,還可以通過增加或者刪除索引來繞過這個問題屠缭。

set long_query_time=0;
select * from t where a between 10000 and 20000; 
//強行是下面的語句走a這個索引箍鼓。
select * from t force index(a) where a between 10000 and 20000;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市呵曹,隨后出現(xiàn)的幾起案子款咖,更是在濱河造成了極大的恐慌,老刑警劉巖奄喂,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件铐殃,死亡現(xiàn)場離奇詭異,居然都是意外死亡跨新,警方通過查閱死者的電腦和手機富腊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來域帐,“玉大人赘被,你說我怎么就攤上這事⌒ごВ” “怎么了民假?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長龙优。 經(jīng)常有香客問我羊异,道長,這世上最難降的妖魔是什么彤断? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任野舶,我火速辦了婚禮,結(jié)果婚禮上宰衙,老公的妹妹穿的比我還像新娘筒愚。我一直安慰自己,他們只是感情好菩浙,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布巢掺。 她就那樣靜靜地躺著句伶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪陆淀。 梳的紋絲不亂的頭發(fā)上考余,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天,我揣著相機與錄音轧苫,去河邊找鬼楚堤。 笑死,一個胖子當著我的面吹牛含懊,可吹牛的內(nèi)容都是我干的身冬。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼岔乔,長吁一口氣:“原來是場噩夢啊……” “哼酥筝!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起雏门,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤嘿歌,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后茁影,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宙帝,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年募闲,在試婚紗的時候發(fā)現(xiàn)自己被綠了步脓。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡浩螺,死狀恐怖靴患,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情年扩,我是刑警寧澤蚁廓,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站厨幻,受9級特大地震影響相嵌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜况脆,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一饭宾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧格了,春花似錦看铆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽否淤。三九已至,卻和暖如春棠隐,著一層夾襖步出監(jiān)牢的瞬間石抡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工助泽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留啰扛,地道東北人。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓嗡贺,卻偏偏與公主長得像隐解,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子诫睬,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容