Comment

You could split table into several different tables. One of criteria could be year (table1: from 0 to 2000, table2: from 2001 to 2003, etc). Then You rewrite Your queries to use UNION when it is needed.

Comment

The same structure, indexes etc. After You create tables, then (pseudocode):
1a. select * from transaction order by requestId limit 1;
1b. $row = mysql_fetch_assoc()
2a. parse $year from date column
2b. get $requestId
3. if ($year < 2000) $table = transaction0_1999
elseif( $year < 2008 ) $table = transaction2000_2007
else $table = transaction2008_2015
4. insert into + $table + $row
5. delete from transaction where requestId = $requestId
You can write it as partition.php and add it to the cron table:
* * * * * /usr/bin/php /path/to/the/partition.php
Cron will run that script every minute and it will move one row into new table. You could set bigger limit (100, 1000) and loop (1b ... 5) , so it will take less time (or for better performance You could remember requestId's and delete them in one query).

When everything is ready You could select from all the tables:
select * from transaction 0_1999 where condition
union
select * from transaction 2000_2007 where condition
union
select * from transaction 2008_2015 where condition
(I hope I wrote that query properly)