MySQL 5.5 DB で次の問題が発生しました。
2 つのテーブル:
表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`)
)
それぞれに約 1,500 万行が含まれています。
Table2
ここで、 whereからすべての行を取得し、それらglobal_pept_id = 27443
の を使用して、wherepeptide_identification_id
からすべての情報を照会します。Table1
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 分後に停止しました)、2 番目のテーブルに使用されるインデックスがないためだと想像できますが、両方の ID は主キーであるため、正しくインデックスを作成する必要があります。
単独で実行した場合、内部選択の結果には最大 3 秒かかり、最大 3,000 行が返されます。したがって、問題は 3000 * 15mio の比較を行っているため、Table2 ですべての行がチェックされていると思います。
しかし、どうすればこれを修正できますか?
助けていただければ幸いです-void