I found a nice article here.
Basically, you want large sets not in an arrayref, but as a hash, since it's more clear what column holds the data.
e.g.

# tested this on live data, this is twice as fast as fetchrow_hashref,+ and has the same advantage..
# example taken from the link above.
my @fields = (qw(emp_id first_name monthly_payment));
$sth->execute;
my %rec =();
$sth->bind_columns(map {\$rec{$_}} @fields);
print "$rec{emp_id}\t",
"$rec{first_name}\t",
"$rec{monthly_payment}\n"
while $sth->fetchrow_arrayref;