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