2017-05-04 31 views
2

我有一個子查詢,應該是快如閃電查詢,而是它的unusably緩慢。任何人都可以建議讓MySQL正常運行的方法嗎?獲得表現真的很差的MySQL查詢

使用MySQL服務器版本:41年5月5日的MySQL社區服務器(GPL)

做一個組合查詢:

Explain SELECT * FROM StudySpecSubject WHERE SubjectID IN (
       SELECT SubjectID FROM StudySpecSubject WHERE SpecimenID ='123456'); 

id select_type   table   type  possible_keys key  key_len ref  rows  Extra                                                               
--- ------------------- ---------------- ---------- --------------- ------- ------- ---------- -------- ------------------------ 
    1 PRIMARY    StudySpecSubject ALL  <null>   <null> <null> <null>  14015412 Using where    
    2 DEPENDENT SUBQUERY StudySpecSubject index_subq Subject,rlimsID Subject 66  func,const 1  Using index; Using where 

做同樣的查詢作爲兩個單獨的查詢:

Explain SELECT SubjectID FROM StudySpecSubject WHERE SpecimenID ='123456'; 
Explain SELECT * FROM StudySpecSubject WHERE SubjectID IN ('AB-CDEF'); 

id select_type   table   type possible_keys key  key_len ref rows Extra 
--- ------------------- ---------------- ---- ------------- ------- ------- ----- ---- ----------- 
    1 SIMPLE    StudySpecSubject ref rlimsID  rlimsID 33  const 1 Using where 

id select_type   table   type possible_keys key  key_len ref rows Extra 
--- ------------------- ---------------- ---- ------------- ------- ------- ----- ---- ----------- 
    1 SIMPLE    StudySpecSubject ref Subject  Subject 33  const 52 Using where 

表定義:

CREATE TABLE `StudySpecSubject` (
    StudyID VarChar(31) NOT NULL, 
    SubjectID VarChar(31) NOT NULL, 
    SpecimenID VarChar(31) NOT NULL, 
    which Int unsigned NOT NULL, 
    INDEX Study (StudyID, SubjectID, SpecimenID), 
    INDEX Subject (SubjectID, SpecimenID), 
    INDEX rlimsID (SpecimenID), 
    INDEX byTable (which) 
) ENGINE = INNODB DEFAULT CHARSET=latin1; 
+2

我可能是不正確的,但是這是比'選擇不同的* FROM StudySpecSubject WHERE SpecimanID = '123456';'? – Ben

+0

@Ben它有點不同。一個'SubjectID'可以在表中多行。此查詢獲取所有的行,每'SubjectID'如果他們行已'SpecimentID =「123456'。 – Barmar

回答

3

MySQL在某些WHERE IN (SELECT ...)查詢中臭名昭着。最好把它們寫成JOIN

SELECT t1.* 
FROM StudySpecSubject AS t1 
JOIN StudySpecSubject AS t2 ON t1.SubjectID = t2.SubjectID 
WHERE t2.SpecimenID = '123456' 

MySQL的錯誤是,而不是獲取從子查詢所有受試者的ID,並使用該索引表時,它掃描整個表在主查詢,然後執行子查詢,以測試所述受試者ID在返回的表中。