Im writing this complex query to return a large dataset, which is about 100,000 records. The query runs fine until i add in this OR statement to the WHERE clause:
AND (responses.StrategyFk = strategies.Id Or responses.StrategyFk IS
Null)
Now i understand that by putting the or statement in there it adds a lot of overhead.
Without that statement and just:
AND responses.StrategyFk = strategies.Id
The query runs within 15 seconds, but doesn’t return any records that didn’t have a fk linking a strategie.
Although i would like these records as well. Is there an easier way to find both records with a simple where statement? I can’t just add another AND statement for null records because that will break the previous statement. Kind of unsure of where to go from here.
Heres the lower half of my query.
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
try:
That’s it. No OR condition is really needed, because that’s what a LEFT JOIN does in this case. Anywhere responses.StrategyFk IS NULL will result in no match to the
strategiestable, and it wil return a row for that.See this link for a simple explanation of joins: http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html
After that, if you’re still having performance issues then you can start looking at the
EXPLAIN SELECT ... ;output and looking for indexes that may need to be added. Optimizing Queries With Explain — MySQL Manual