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.
中
我有一个带有子查询的查询,它应该快如闪电,但它却慢得无法使用。谁能建议让 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.
中