For the query above, the following recommendations will be helpful as part of the SQL tuning process.
You'll find 3 sections below:
The optimization process and recommendations:
- Create Optimal Indexes (modified query below): The recommended indexes are an integral part of this optimization effort and should be created before testing the execution duration of the optimized query.
- Prefer Inner Join Over Left Join (modified query below): We identified that one or more left joined entities (e.g. `model`) are used in the 'where' clause, in a way that allows to replace it with an optimized inner join. Inner joins can be fully optimized by the database, while Left joins apply limitations on the database's optimizer.
- Use Numeric Column Types For Numeric Values (query line: 19): Referencing a numeric value (e.g. 1) as a string in a WHERE clause might result in poor performance. Possible impacts of storing numbers as varchars: more space will be used, you won't be able to perform arithmetic operations, the data won't be self-validated, aggregation functions like SUM won't work, the output may sort incorrectly and more. If the column is numeric, remove the quotes from the constant value, to make sure a numeric comparison is done.
- Use Numeric Column Types For Numeric Values (query line: 39): Referencing a numeric value (e.g. 1) as a string in a WHERE clause might result in poor performance. Possible impacts of storing numbers as varchars: more space will be used, you won't be able to perform arithmetic operations, the data won't be self-validated, aggregation functions like SUM won't work, the output may sort incorrectly and more. If the column is numeric, remove the quotes from the constant value, to make sure a numeric comparison is done.
- Use Numeric Column Types For Numeric Values (query line: 55): Referencing a numeric value (e.g. 1) as a string in a WHERE clause might result in poor performance. Possible impacts of storing numbers as varchars: more space will be used, you won't be able to perform arithmetic operations, the data won't be self-validated, aggregation functions like SUM won't work, the output may sort incorrectly and more. If the column is numeric, remove the quotes from the constant value, to make sure a numeric comparison is done.
- Use UNION ALL instead of UNION (query line: 41): Always use UNION ALL unless you need to eliminate duplicate records. By using UNION ALL, you'll avoid the expensive distinct operation the database applies when using a UNION clause.
Optimal indexes for this query:
ALTER TABLE `model` ADD INDEX `model_idx_results_class_id` (`Results`,`Class_ID`);
ALTER TABLE `naw` ADD INDEX `naw_idx_user_id` (`User_ID`);
The optimized query:
SELECT
naw.Name,
naw.Surname,
model.Title,
model.Results,
model.Class_ID,
GROUP_CONCAT(naw.Name,
' ',
naw.Surname,
' with: ',
model.Title SEPARATOR ' ') AS outcome
FROM
naw
INNER JOIN
model
ON model.User_ID = naw.User_ID
WHERE
model.Results = 'Bronze'
AND model.Class_ID = '1'
UNION
SELECT
naw.Name,
naw.Surname,
model.Title,
model.Results,
model.Class_ID,
GROUP_CONCAT(naw.Name,
' ',
naw.Surname,
' with: ',
model.Title SEPARATOR ' ') AS outcome
FROM
naw
INNER JOIN
model
ON model.User_ID = naw.User_ID
WHERE
model.Results = 'Silver'
AND model.Class_ID = '1'
UNION
SELECT
naw.Name,
naw.Surname,
model.Title,
model.Results,
model.Class_ID,
model.ID
FROM
naw
INNER JOIN
model
ON model.User_ID = naw.User_ID
WHERE
model.Results = 'Gold'
AND model.Class_ID = '1'