我的 MySQL 5.5 DB 出现以下问题 - 我对此很陌生,所以可能很明显出了什么问题,但我似乎无法理解:
两张表:
表格1
CREATE TABLE `sequence_matches` (
`Sample_ID` INT(6) NOT NULL,
`Sequence_Match_ID` INT(8) NOT NULL,
`Start` INT(6) NULL DEFAULT NULL,
`End` INT(6) NULL DEFAULT NULL,
`Coverage` DOUBLE(5,2) NULL DEFAULT NULL,
`Frag_String` VARCHAR(255) NULL DEFAULT NULL,
`rms_mass_error_prod` DOUBLE(10,4) NULL DEFAULT NULL,
`rms_rt_error_prod` DOUBLE(10,4) NULL DEFAULT NULL,
PRIMARY KEY (`Sample_ID`, `Sequence_Match_ID`)
)
和
表 2
CREATE TABLE `peptide_identifications` (
`Sample_ID` INT(6) NOT NULL,
`Peptide_identification_ID` INT(8) NOT NULL,
`Mass_error` DOUBLE(10,4) NULL DEFAULT NULL,
`Mass_error_ppm` DOUBLE(10,4) NULL DEFAULT NULL,
`Score` DOUBLE(10,4) NULL DEFAULT NULL,
`Type` VARCHAR(45) NULL DEFAULT NULL,
`global_pept_ID` INT(8) NOT NULL,
PRIMARY KEY (`Sample_ID`, `Peptide_identification_ID`),
INDEX `Index` (`global_pept_ID`)
)
它们每个都包含约 1500 万行。
现在,我想要来自Table2
where的所有这些行global_pept_id = 27443
,然后使用其中peptide_identification_id
的那些,从Table1
where查询所有信息peptide_identification_id = sequence_match_id
。
我尝试了以下语句:
SELECT * from sequence_matches
JOIN (
SELECT peptide_identification_id
FROM peptide_identifications
WHERE global_pept_id = 27443
) as tmp_pept
ON sequence_match_id = peptide_identification_id;
这里是该查询的解释:
现在这个查询非常非常慢(我实际上从未完成它,大约 10 分钟后停止它),我可以想象这是因为没有用于第二个表的索引,尽管两个 ID 都是主键,因此它们应该被索引对吗?
内部选择的结果需要 ~3 sek,如果单独执行,则返回 ~3k 行。所以我认为问题在于进行 3000 * 15mio 比较,因为在表 2 中检查了每一行。
但是我该如何解决这个问题?
任何帮助表示赞赏-voiD