OK, every time you delete a row, all indexes have to be updated - so it is the 28 indexes that are slowing this down so much.
from the manual:
"The time required to delete individual rows is exactly proportional to the number of indexes. To delete rows more quickly, you can increase the size of the key cache by increasing the key_buffer_size system variable."
Now there is no absolute rule to this but with some types of index it is better to drop the index, do the delete and then recreate the index. This is particularly the case with FULL TEXT SEARCH indexes, as the manual tells us.
When rows are deleted the space they occupied in the disk file can be reused by rows inserted later, the same applies for indexes. This results in data that is badly ordered and requires a lot of disk seeks. Using OPTIMISE TABLE after a delete will reorder the table and indexes to prevent this problem. So after any major delete operation it is best to optimise the table and get rid of all the wasted space that slows things down.
Of course, the reordered data will be in PRIMARY KEY order which may still force a lot of disk seeks when querying on another column. If primary key is an autoinc then date inserted columns will be in the same order naturally - so it all depends on what this date column in your query is.
A fast efficient method for deleting a lot of rows using another index is to select the primary keys of the required rows into a work table and then delete by joining to that table. Rows will be deleted in primary key order which should be the most disk seek efficient.