MySQL 查询的性能非常差

Getting really poor performance on MySQL query

我有一个带有子查询的查询,它应该快如闪电,但它却慢得无法使用。谁能建议让 MySQL 正常执行的方法?

使用 MySQL 服务器版本:5.5.41 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

Table定义:

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;

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,并使用它来索引 table,而是在主查询中扫描整个 table然后执行子查询以测试主题​​ ID 是否在返回的 table.