Delete-Related-Table.md


Using where in or exists depends on table size, and check index the query using.

explain delete from delete_related_table_member_tags relation where tag_id in
                    (select id from delete_related_table_tags tag where tag.type = 'A');

explain delete from delete_related_table_member_tags relation
       where exists(select id from delete_related_table_tags tag where tag.id = relation.tag_id and tag.type = 'A');

explain delete relation from delete_related_table_member_tags relation
inner join delete_related_table_tags tag on relation.tag_id = tag.id
where tag.type = 'A';
idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra
1SIMPLEtagnullrefPRIMARY,typetype1022const2496048100Using index
1DELETErelationnullreftag_idtag_id4test.tag.id1100null

Approaches actual tests

See file in playground/laravel/app/Console/Commands/MySQLDeleteRelatedTable.php.

Results


/**
 * test_type_without_id_type_index
 *
 * ---deleteFromWhereIn start---
run time: 41.261170148849seconds
---deleteFromWhereIn end----
---deleteFroWhereExists start---
run time: 41.044189929962seconds
---deleteFroWhereExists end----
---deleteFromJoin start---
run time: 42.302510023117seconds
---deleteFromJoin end----

 *
 *
 */

/**
 *
 * test_type_with_id_type_index
 *
 * ---deleteFromWhereIn start---
run time: 41.456815004349seconds
---deleteFromWhereIn end----
---deleteFroWhereExists start---
run time: 42.01546216011seconds
---deleteFroWhereExists end----
---deleteFromJoin start---
run time: 39.968888044357seconds
---deleteFromJoin end----

 *
 */

/**
 * test_type_with_id_type_index_and_force_index
 *
 * ---deleteFromWhereIn start---
run time: 44.467664003372seconds
---deleteFromWhereIn end----
---deleteFroWhereExists start---
run time: 39.107469081879seconds
---deleteFroWhereExists end----
---deleteFromJoin start---
run time: 62.701831102371seconds
---deleteFromJoin end----

 */