In case you have your own slow SQL query, you can optimize it automatically here.
For the query above, the following recommendations will be helpful as part of the SQL tuning process.
You'll find 3 sections below:
ALTER TABLE `a` ADD INDEX `a_idx_type_deleted` (`type`,`deleted`);
ALTER TABLE `ass` ADD INDEX `ass_idx_borrower_id_created` (`borrower_id`,`created`);
ALTER TABLE `b` ADD INDEX `b_idx_id` (`id`);
ALTER TABLE `n` ADD INDEX `n_idx_deleted_status_lenderu_created` (`deleted`,`status`,`lenderUserId`,`created`);
ALTER TABLE `n` ADD INDEX `n_idx_lenderuserid_created` (`lenderUserId`,`created`);
SELECT
borrower_id,
a_created,
initiator_team_id,
initiator_user_id,
old_team_id,
old_user_id,
new_team_id,
new_user_id
FROM
((SELECT
a.borrowerId AS borrower_id,
a.created AS a_created,
NULL AS initiator_team_id,
NULL AS initiator_user_id,
NULL AS old_team_id,
NULL AS old_user_id,
n.teamId AS new_team_id,
a.lenderUserId AS new_user_id
FROM
a
INNER JOIN
b
ON a.borrowerId = b.id
INNER JOIN
n
ON a.lenderUserId = n.lenderUserId
AND a.created >= n.created
AND (
(
n.deleted IS NULL
AND n.status = 'active'
)
)
LEFT OUTER JOIN
ass
ON a.borrowerId = ass.borrower_id
AND a.created = ass.created
WHERE
a.`type` = 'created'
AND a.deleted IS NULL
AND ass.borrower_id IS NULL)
UNION
DISTINCT (SELECT
a.borrowerId AS borrower_id,
a.created AS a_created,
NULL AS initiator_team_id,
NULL AS initiator_user_id,
NULL AS old_team_id,
NULL AS old_user_id,
n.teamId AS new_team_id,
a.lenderUserId AS new_user_id
FROM
a
INNER JOIN
b
ON a.borrowerId = b.id
INNER JOIN
n
ON a.lenderUserId = n.lenderUserId
AND a.created >= n.created
AND (a.created < n.deleted)
LEFT OUTER JOIN
ass
ON a.borrowerId = ass.borrower_id
AND a.created = ass.created
WHERE
a.`type` = 'created'
AND a.deleted IS NULL
AND ass.borrower_id IS NULL)
) AS union1