d5a9731845
closes https://linear.app/tryghost/issue/ENG-791/migration-to-fix-email-recipients-indexes Our indexes over single columns (`delivered_at`, `opened_at`, `failed_at`) were ineffective because the only time we query those is alongside `email_id` meaning we were frequently performing full table scans on very large tables during our email analytics jobs. - added migration to add new indexes covering `email_id` and the respective columns - added migration to drop the old indexes that weren't being used in any query plans Local runtime with ~2M email_recipient rows: - before: 1.7s - after: 99ms Explain output... before: ``` +----+-------------+------------------+------------+-------+----------------------------------------------------------------------------------+----------------------------------------------+---------+-------+--------+----------+------------------------------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+------------------+------------+-------+----------------------------------------------------------------------------------+----------------------------------------------+---------+-------+--------+----------+------------------------------------+ | 1 | UPDATE | emails | NULL | index | NULL | PRIMARY | 98 | NULL | 1 | 100.00 | Using where | | 4 | SUBQUERY | email_recipients | NULL | range | email_recipients_email_id_member_email_index,email_recipients_failed_at_index | email_recipients_failed_at_index | 6 | NULL | 2343 | 7.76 | Using index condition; Using where | | 3 | SUBQUERY | email_recipients | NULL | ref | email_recipients_email_id_member_email_index,email_recipients_opened_at_index | email_recipients_email_id_member_email_index | 98 | const | 159126 | 50.00 | Using where | | 2 | SUBQUERY | email_recipients | NULL | ref | email_recipients_email_id_member_email_index,email_recipients_delivered_at_index | email_recipients_email_id_member_email_index | 98 | const | 159126 | 50.00 | Using where | +----+-------------+------------------+------------+-------+----------------------------------------------------------------------------------+----------------------------------------------+---------+-------+--------+----------+------------------------------------+ ``` after: ``` +----+-------------+------------------+------------+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------+---------+------+--------+----------+--------------------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+------------------+------------+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------+---------+------+--------+----------+--------------------------+ | 1 | UPDATE | emails | NULL | index | NULL | PRIMARY | 98 | NULL | 1 | 100.00 | Using where; | | 4 | SUBQUERY | email_recipients | NULL | range | email_recipients_email_id_member_email_index,email_recipients_email_id_delivered_at_index,email_recipients_email_id_opened_at_index,email_recipients_email_id_failed_at_index | email_recipients_email_id_failed_at_index | 104 | NULL | 60 | 100.00 | Using where; Using index | | 3 | SUBQUERY | email_recipients | NULL | range | email_recipients_email_id_member_email_index,email_recipients_email_id_delivered_at_index,email_recipients_email_id_opened_at_index,email_recipients_email_id_failed_at_index | email_recipients_email_id_opened_at_index | 104 | NULL | 119496 | 100.00 | Using where; Using index | | 2 | SUBQUERY | email_recipients | NULL | range | email_recipients_email_id_member_email_index,email_recipients_email_id_delivered_at_index,email_recipients_email_id_opened_at_index,email_recipients_email_id_failed_at_index | email_recipients_email_id_delivered_at_index | 104 | NULL | 146030 | 100.00 | Using where; Using index | +----+-------------+------------------+------------+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------+---------+------+--------+----------+--------------------------+ ``` |
||
---|---|---|
.. | ||
api | ||
frontend | ||
server | ||
shared |