patternsqlMinor
Optimise MySQL SELECT with LEFT JOIN subquery
Viewed 0 times
leftwithjoinoptimisemysqlsubqueryselect
Problem
I have a query which combines a LEFT JOIN and subquery. The dataset is quite big and the time to execute the statement is over 70 seconds.
This query should return all lists for a country. Each list is specific to a unique baby. For each list I would like to return a count of the number of children that have the same parent.
If I remove the LEFT JOIN subquery the fetch time is 0.1 seconds. Is there a way to make the query more efficient?
SELECT
s.siblings,
l.id
FROM
`list` l
INNER JOIN
child c ON c.id = l.child_id
INNER JOIN
parent p ON p.id = c.parent_id
LEFT JOIN (
SELECT COUNT(c.id) AS siblings, c.id, c.parent_id
FROM child c
GROUP BY c.id
) AS s ON s.parent_id = c.parent_id AND s.id != c.id
WHERE
l.country = 1
GROUP BY l.id, s.siblings
ORDER BY l.dateaddedThis query should return all lists for a country. Each list is specific to a unique baby. For each list I would like to return a count of the number of children that have the same parent.
If I remove the LEFT JOIN subquery the fetch time is 0.1 seconds. Is there a way to make the query more efficient?
Solution
The main reason for the slow query is the join on a subquery. This will not use indexes. Then, you not only join with a derived table (subquery), but as well group total result based on subquery column -
In this case it could help to:
for return correct parent_id
This could have variants, but it is often faster and less server-loading than a complicated set of subqueries with joins.
GROUP BY l.id, s.SiblingsIn this case it could help to:
- create temporary table from subquery, it also could include subquery
for return correct parent_id
- create index on this table
- use temporary table in join
- drop temporary table
This could have variants, but it is often faster and less server-loading than a complicated set of subqueries with joins.
Context
StackExchange Database Administrators Q#131954, answer score: 3
Revisions (0)
No revisions yet.