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:
- Avoid Calling Functions With Indexed Columns (query line: 12): When a function is used directly on an indexed column, the database's optimizer won’t be able to use the index. For example, if the column `producent` is indexed, the index won’t be used as it’s wrapped with the function `INSTR`. If you can’t find an alternative condition that won’t use a function call, a possible solution is to store the required value in a new indexed column.
- Avoid Calling Functions With Indexed Columns (query line: 13): When a function is used directly on an indexed column, the database's optimizer won’t be able to use the index. For example, if the column `producent` is indexed, the index won’t be used as it’s wrapped with the function `INSTR`. If you can’t find an alternative condition that won’t use a function call, a possible solution is to store the required value in a new indexed column.
- Avoid Calling Functions With Indexed Columns (query line: 14): When a function is used directly on an indexed column, the database's optimizer won’t be able to use the index. For example, if the column `producent` is indexed, the index won’t be used as it’s wrapped with the function `INSTR`. If you can’t find an alternative condition that won’t use a function call, a possible solution is to store the required value in a new indexed column.
- 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.
Optimal indexes for this query:
ALTER TABLE `bordspellen` ADD INDEX `bordspellen_idx_producent` (`producent`);
The optimized query:
SELECT
DISTINCT bordspellen.producent,
LEFT(RIGHT(bordspellen.producent,
LENGTH(bordspellen.producent) - INSTR(bordspellen.producent,
'O') + 1),
INSTR(bordspellen.producent,
'E') - INSTR(bordspellen.producent,
'O') + 1) AS O_tot_E FROM
bordspellen
WHERE
INSTR(bordspellen.producent, 'E') > INSTR(bordspellen.producent, 'O')
AND INSTR(bordspellen.producent, 'O')
AND INSTR(bordspellen.producent, 'E')
ORDER BY
bordspellen.producent