Inserting into three different tables, using foreign keys -- 500000x each
Read the entire CSV into a new MyISAM table with no indexes.
Write SQL statements to migrate that data en-masse to the other 4 tables.
Drop that table.


100-150 IOPs -- not bad.  That's about all you can get with a consumer-quality disk.

So, the trick is to minimize the IOPs.


What engine are you using?  (InnoDB has some tunables that can help/hurt.)
What indexes?  (The more indexes, the more I/O.  And the cache may not be set optimally.)