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