[英]Explain query - MySQL not using index from table
我正在嘗試學習MySQL中的explain
語句,但遇到了麻煩。
對於我的實驗,我創建了兩個表(每個表有10行),並通過一個簡單的聯接進行了explain
。 自然,不使用任何索引,而是掃描10 * 10 = 100行(我在圖像中添加了輸出,因為EXPLAIN的非常長的輸出被自身包裝了。代碼也位於此pastebin中 ):
然后,我添加了主鍵和索引,並重新發出了explain
命令:
但是如您所見,MySQL仍在完全掃描用戶表,就好像沒有主鍵一樣。 怎么了?
這有一段評論的時間。
基本上,您的桌子太小了。 對於如此小的數據,您無法獲得合理的性能指示-查詢僅需要將兩個數據頁加載到內存中以進行查詢。 嵌套循環聯接需要100次比較。 相比之下,加載索引和執行二進制搜索的工作量大約相同,甚至更多。
如果您希望獲得explain
的感覺,請使用具有幾萬行的表。
您似乎在詢問EXPLAIN
, INDEXing
和優化特定的SELECTs
。
為了這:
select u.name
from users as u
join accounts as a on u.id = a.user_id
where a.amount > 1000;
優化器將在users
和accounts
之間選擇首先要查看的表。 然后它將反復到達另一個表。
既然你說a.amount > ...
但無事u
,優化很可能挑選a
第一。
如果a.amount > 1000
足夠有選擇性(少於行的20%) 並且有INDEX(amount)
,它將使用該索引。 否則,它會做的表掃描a
。
要進入u
,它需要一些以id
開頭的索引。 請記住, PRIMARY KEY
是索引。
我的索引菜譜涵蓋了這一點以及更多基礎知識。
另請參見myxlpain的EXPLAIN
討論。
請使用SHOW CREATE TABLE
; 它比DESCRIBE
更具描述性。
EXPLAIN FORMAT=JSON SELECT...
還是有點神秘,但是它比常規EXPLAIN
具有更多細節。
好吧,因為您的主過濾器具有“>”比較運算符,所以它可以進行全表掃描,因為它可能會或可能不會返回所有行。
當您將帶有“ user_id”列的“ accounts”表結合在一起時,它會在“可能的鍵”中顯示“ user_id”索引,但是由於FULL TABLE SCAN進程,它沒有使用它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.