2015-04-17 64 views
-1

我跑我的查詢說明,我得到了這些結果:爲什麼mysql每個表只使用一個索引?

id select_type table type possible_keys key key_len ref rows Extra 
1 PRIMARY bussiness index PRIMARY,closeBussStatus,bussStatus,approveStatus,cityID,presaleID,nameEn,DUNS,xy,subCategoryID PRIMARY 4 NULL 295794 Using where; Using temporary; Using filesort 
1 PRIMARY favourites ref userID,bussID,userId_bussId bussID 4 haanet.bussiness.bussID 1 Using where 
3 DEPENDENT SUBQUERY rating ref bussId bussId 4 func 1 NULL 
2 DEPENDENT SUBQUERY rating ref bussId bussId 4 func 1 Using index 

這表明第一個表有很多possible_keys的,但它只是選擇其中一個指標。爲什麼MySQL不爲每個表使用多個索引?

+2

請顯示相關查詢。 – wallyk

+2

請儘可能地發佈純文本,比如'SHOW CREATE TABLE'的輸出,而不是一個小小的,難以辨認的屏幕截圖。 – tadman

+0

@tadman好的我會做的,一分鐘! – david

回答

1

(我回答的主題;似乎大多數細節已經消失。)

爲什麼只用一個指數?這樣想想吧。假設你有一百萬人的目錄。其實你有兩個副本,一個按姓氏排序,一個按姓氏排序。在一個列表中,您可以找到名字爲「Rick」的一千個(或多個)條目以及唯一的識別號碼。在另一個名單中,你會發現一個名字爲'James'的人,加上這個ID。既然你在找我,你必須把這兩個子列表放在一起找到我的一個ID。 (另一個是Superfreak的id)它很混亂,它涉及兩個臨時表,可能是某種類型等等。

優化器認爲通過一個列表更簡單一些,檢查WHERE子句的其餘部分。

但實際上(在這種情況下),「複合」指數會更好。也就是說,有一百萬個名單,按姓氏和名字的組合排序:INDEX(last_name, first_name)。這樣,我很容易找到。

實際上,優化器將會有時做我先說的。它稱之爲「索引合併交集」。 I discuss all these topics in a blog

相關問題