簡體   English   中英

解釋查詢-MySQL不使用表索引

[英]Explain query - MySQL not using index from table

我正在嘗試學習MySQL中的explain語句,但遇到了麻煩。

對於我的實驗,我創建了兩個表(每個表有10行),並通過一個簡單的聯接進行了explain 自然,不使用任何索引,而是掃描10 * 10 = 100行(我在圖像中添加了輸出,因為EXPLAIN的非常長的輸出被自身包裝了。代碼也位於此pastebin中 ):

壞表設計

然后,我添加了主鍵和索引,並重新發出了explain命令:

在此處輸入圖片說明

但是如您所見,MySQL仍在完全掃描用戶表,就好像沒有主鍵一樣。 怎么了?

這有一段評論的時間。

基本上,您的桌子太小了。 對於如此小的數據,您無法獲得合理的性能指示-查詢僅需要將兩個數據頁加載到內存中以進行查詢。 嵌套循環聯接需要100次比較。 相比之下,加載索引和執行二進制搜索的工作量大約相同,甚至更多。

如果您希望獲得explain的感覺,請使用具有幾萬行的表。

您似乎在詢問EXPLAININDEXing和優化特定的SELECTs

為了這:

select  u.name
    from  users as u
    join  accounts as a on u.id = a.user_id
    where  a.amount > 1000;

優化器將在usersaccounts之間選擇首先要查看的表。 然后它將反復到達另一個表。

  1. 既然你說a.amount > ...但無事u ,優化很可能挑選a第一。

  2. 如果a.amount > 1000足夠有選擇性(少於行的20%) 並且INDEX(amount) ,它將使用該索引。 否則,它會做的表掃描a

  3. 要進入u ,它需要一些以id開頭的索引。 請記住, PRIMARY KEY 索引。

我的索引菜譜涵蓋了這一點以及更多基礎知識。

另請參見myxlpainEXPLAIN討論。

請使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM