私はMySQLを使用して、それがこのようなクエリを実行するために多くの時間を要し、いくつかの理由のためだ:このSQLクエリを最適化する方法は? (映画データベース)
SELECT
DISTINCT (Movies.id) AS id,
Movies.UnMoID AS UnMoID,
Movies.runtime AS runtime
FROM
Movies
INNER JOIN Acted ON Acted.UnMoID = Movies.UnMoID
INNER JOIN Actors ON Acted.UnMoActorID = Actors.UnMoActorID
INNER JOIN Directed ON Directed.UnMoID = Movies.UnMoID
INNER JOIN Directors ON Directed.UnMoDirectorID = Directors.UnMoDirectorID
WHERE
Actors.name LIKE '%spiderman%'
OR Directors.name LIKE '%spiderman%'
OR Movies.originalTitle LIKE '%spiderman%'
OR Movies.englishTitle LIKE '%spiderman%'
OR Movies.alsoKnownAs LIKE '%spiderman%'
OR Movies.taglines LIKE '%spiderman%'
OR Movies.plot LIKE '%spiderman%'
AND Movies.validated =1
AND Movies.ageCertificate <=20
GROUP BY Movies.id
ORDER BY added DESC
これは私を与えるだろう:「(6.5320秒でクエリを実行され、2の結果を得ました")
この特定のクエリに対する説明
ができます:id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE Movies ALL UnMoID NULL NULL NULL 925 Using temporary; Using filesort
1 SIMPLE Directed ref UnMoID,UnMoDirectorID UnMoID 62 Movies.Movies.UnMoID 1
1 SIMPLE Directors eq_ref UnMoDirectorID UnMoDirectorID 62 Movies.Directed.UnMoDirectorID 1
1 SIMPLE Acted ref UnMoID,UnMoActorID UnMoID 62 Movies.Movies.UnMoID 34
1 SIMPLE Actors eq_ref UnMoActorID UnMoActorID 62 Movies.Acted.UnMoActorID 1 Using where
プロファイリング情報:
......
Creating tmp table 0.000032
Sorting for group 0.000007
executing 0.000005
Copying to tmp table 6.324177
Sorting result 0.000027
Sending data 0.000019
......
それはクエリと時間のほとんどは、に行くたびに実行するために20秒程度かかり、最悪のケースではCopying to tmp table
。クエリを最適化し、適切なクエリ時間を得るためにはどうすればよいですか。
Movies.id PRIMARY
Movies.UnMoID UNIQUE
Movies.runtime INDEX
Acted.UnMoID INDEX
Acted.UnMoActorID INDEX
Actors.UnMoActorID UNIQUE
Actors.name UINDEX
Directed.UnMoID INDEX
Directed.UnMoDirectorID INDEX
Directors.UnMoDirectorID UNIQUE
Directors.name INDEX
Movies.originalTitle INDEX
Movies.englishTitle INDEX
Movies.alsoKnownAs INDEX
Movies.taglines INDEX
Movies.plot INDEX
「DISTINCT」に続く大きな結合の方が遅くなります。重複がないように結合を書き直してください。 – OrangeDog