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