The first problem here is something you cannot control. What is it ???

The Query Optimizer's reaction to a FULLTEXT index. Why ?

(Imagine the start of a STAR WARS moive with scrolling words...)

A very long ago, I discovered that FULLTEXT indexes will nullify the MySQL Query Optimizer.

- `Jun 10, 2011` : https://dba.stackexchange.com/questions/3254/mysql-fulltext-boolean-ignore-phrase/3257#3257
- `Oct 25, 2011` : https://dba.stackexchange.com/questions/7136/fulltext-index-ignored-in-boolean-mode-with-number-of-words-conditional/7216#7216
- `Mar 18, 2012` : https://dba.stackexchange.com/questions/15214/why-is-like-more-than-4x-faster-than-match-against-on-a-fulltext-index-in-mysq/15218#15218
- [AND MORE LIKE IT !!!][1]

#SUGGESTION

Refactor the Query so that the `MATCH ...AGAINST` collects keys only

##EXAMPLE #1

    SELECT a.id FROM a 
    WHERE
    MATCH (`search1`,`search2`) AGAINST ('aaaa' IN BOOLEAN MODE)
    ORDER BY a.id DESC
    LIMIT 5;

should become something like

    SELECT N.id FROM
    (SELECT id FROM a WHERE
    MATCH (`search1`,`search2`) AGAINST ('aaaa' IN BOOLEAN MODE)) M
    INNER JOIN a N USING (id)
    ORDER BY N.id DESC LIMIT 5;

##EXAMPLE #2

    SELECT a.id,a.popularity FROM a 
    WHERE
    MATCH (`search1`,`search2`) AGAINST ('aaaa' IN BOOLEAN MODE)
    ORDER BY a.popularity DESC
    LIMIT 5;

should become something like

    SELECT N.id,N.popularity FROM
    (SELECT id FROM a WHERE
    MATCH (`search1`,`search2`) AGAINST ('aaaa' IN BOOLEAN MODE)) M
    INNER JOIN a N USING (id)
    ORDER BY N.popularity DESC LIMIT 5;


#CONCLUSION

The main idea: Collect the keys using `MATCH ...AGAINST` and join it back to the source table

  [1]: https://dba.stackexchange.com/search?q=user%3A877%20FULLTEXT%20query%20optimizer