I recently found and fixed a bug in a site I was working on that resulted in millions of duplicate rows of data in a table that will be quite large even without them (still
I had a use case of deleting 1M+ rows in the 25M+ rows Table in the MySQL.
Tried different approaches like batch deletes (described above).
I've found out that the fastest way (copy of required records to new table):
CREATE TABLE id_temp_table ( temp_id int);
insert into id_temp_table (temp_id) select.....
Create New table table_new
Insert all records from table to table_new without unnecessary rows that are in id_temp_table
insert into table_new .... where table_id NOT IN (select distinct(temp_id) from id_temp_table);
The whole process took ~1hr. In my use case simple delete of batch on 100 records took 10 mins.