As Kristian demonstrated, sometimes the best way to make transaction operations faster is not to use transaction at all. If your transaction is simple enough, you can express it using stats with a by clause. This is much much faster.
If your transaction is too complex to manage with stats, then you should go out of your way to minimize the number of events dealt with. For example, if you're looking for 3 or 4 events out of 20 that make up a transaction, search only on those 3 or 4, like:
sourcetype=foo ( event 1 stuff ) OR ( event 2 stuff ) OR ( event 3 stuff ) | transaction
Also, limit the size/scope of your transactions by using startswith / endswith so that transaction can "complete" them as soon as possible.