3

この複雑なクエリを記述して、約100,000レコードの大きなデータセットを返します。このORステートメントをWHERE句に追加するまで、クエリは正常に実行されます。

AND(responses.StrategyFk=strategies.Idまたはresponses.StrategyFkISNull)

orステートメントをそこに配置すると、多くのオーバーヘッドが追加されることを理解しました。

その声明なしでただ:

AND response.StrategyFk =strategies.Id

クエリは15秒以内に実行されますが、戦略をリンクするfkがないレコードは返されません。

これらのレコードも欲しいのですが。単純なwhereステートメントで両方のレコードを見つける簡単な方法はありますか?nullレコードに別のANDステートメントを追加することはできません。これは、前のステートメントを壊してしまうためです。ここからどこへ行くのかわからない。

これが私のクエリの下半分です。

FROM 
responses, subtestinstances, students, schools, items,
strategies, subtests

WHERE
subtestinstances.Id = responses.SubtestInstanceFk
AND subtestinstances.StudentFk = students.Id
AND students.SchoolFk = schools.Id
AND responses.ItemFk = items.Id
AND (responses.StrategyFk = strategies.Id Or responses.StrategyFk IS Null)
AND subtests.Id = subtestinstances.SubtestFk
4

2 に答える 2

2

明示的なJOINsを使用してみてください:

...
FROM   responses a
       INNER JOIN subtestinstances b
               ON b.id = a.subtestinstancefk
       INNER JOIN students c
               ON c.id = b.studentfk
       INNER JOIN schools d
               ON d.id = c.schoolfk
       INNER JOIN items e
               ON e.id = a.itemfk
       INNER JOIN subtests f
               ON f.id = b.subtestfk
       LEFT JOIN strategies g
              ON g.id = a.strategyfk 
于 2012-11-30T17:20:34.477 に答える
2

試す:

SELECT ... FROM 
responses
JOIN subtestinstances ON subtestinstances.Id = responses.SubtestInstanceFk
JOIN students ON subtestinstances.StudentFk = students.Id
JOIN schools ON students.SchoolFk = schools.Id
JOIN items ON responses.ItemFk = items.Id
JOIN subtests ON subtests.Id = subtestinstances.SubtestFk
LEFT JOIN strategies ON responses.StrategyFk = strategies.Id

それでおしまい。この場合、LEFT JOINが行うので、OR条件は実際には必要ありません。どこでもresponses.StrategyFkISNULLはstrategiesテーブルに一致しなくなり、そのための行が返されます。

結合の簡単な説明については、次のリンクを参照してください:http: //www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html

その後もパフォーマンスの問題が解決しない場合は、EXPLAIN SELECT ... ;出力を確認し、追加が必要な可能性のあるインデックスを探し始めることができます。Explainを使用したクエリの最適化-MySQLマニュアル

于 2012-11-30T17:21:44.117 に答える