一、mysql explain中rows是怎么計(jì)算的
row值的含義是mysql解釋器【認(rèn)為】應(yīng)該查詢的行數(shù),有人研究過源碼發(fā)現(xiàn)這個(gè)玩意和實(shí)際查詢時(shí)的表現(xiàn)并沒有太多關(guān)系。
簡(jiǎn)單來講就是,這個(gè)rows值只是mysql根據(jù)緩存數(shù)據(jù)的一個(gè)估算,反應(yīng)的是在只有一堆數(shù)據(jù)并且沒有索引時(shí)應(yīng)該掃描的行數(shù)。
加過索引后rows值的計(jì)算方法和不加索引時(shí)相同,依然會(huì)出現(xiàn)幾萬行的情況。但實(shí)際查詢時(shí)mysql會(huì)優(yōu)先讀取索引,根據(jù)B+樹的分支和LIMIT值進(jìn)行判斷。
也就是說實(shí)際執(zhí)行時(shí)可能只讀取了LIMIT條數(shù)據(jù),但是EXPLAIN這個(gè)解釋預(yù)判中的rows數(shù)值卻很大,因?yàn)檫@是未優(yōu)化時(shí)的預(yù)判結(jié)果,這個(gè)算法并沒有隨著索引和查詢條件而更新。
所以根本不用考慮rows行數(shù)過大的問題,只要索引正確且后面沒有用到filesort,查詢時(shí)間也不長(zhǎng),那你的數(shù)據(jù)庫設(shè)計(jì)就沒有問題。
網(wǎng)上好多文章里寫的rows值越小越好其實(shí)是誤區(qū),有時(shí)候索引無論怎么建都會(huì)讓rows顯示很大,這個(gè)表述是錯(cuò)誤的。
你用InnoDB引擎查詢?cè)囋嚕械臅r(shí)候rows值比你數(shù)據(jù)表中總行數(shù)還要大,明顯是一個(gè)緩存估算結(jié)果。
延伸閱讀:
二、什么是執(zhí)行計(jì)劃
有了慢查詢語句后,就要對(duì)語句進(jìn)行分析。一條查詢語句在經(jīng)過MySQL查詢優(yōu)化器的各種基于成本和規(guī)則的優(yōu)化會(huì)后生成一個(gè)所謂的執(zhí)行計(jì)劃,這個(gè)執(zhí)行計(jì)劃展示了接下來具體執(zhí)行查詢的方式,比如多表連接的順序是什么,對(duì)于每個(gè)表采用什么訪問方法來具體執(zhí)行查詢等等。EXPLAIN語句來幫助我們查看某個(gè)查詢語句的具體執(zhí)行計(jì)劃。