Do you have permissions to create temporary table in the database (or any other database hosted on the same mysql server)?
If yes, then I propose the following solution:
CREATE TEMPORARY TABLE temp_indexed_subquery
SELECT id
FROM bigtable
WHERE "where conditions";
SELECT b.* FROM bigtable AS b
JOIN temp_indexed_subquery AS t
ON t.id = b.id;
If no, then try this:
SELECT b.*
FROM bigtable
JOIN (SELECT id FROM bigtable WHERE "where conditions") t ON t.id = b.id;
Its harder to help more without knowing the table structure or the sub-query.
Edit: Ah, I had a similar problem with filesort, and got around it the following way (modifying the first proposed solution):
CREATE TEMPORARY TABLE temp_indexed_subquery
(UNIQUE KEY id(id), KEY title(title))
SELECT id, title
FROM bigtable
WHERE "where conditions";
SELECT b.*, t.title FROM temp_indexed_subquery AS t
JOIN bigtable AS b
ON b.id = t.id
ORDER BY t.title;
Here I'm adding an index on the temporary table's "title" field, and sorting by that. In my case, doing this meant MySQL didn't have to use filesort to give me an ordered result. I hope this helps.
(by the way, how many rows does bigtable have, and how many ids are typically in the indexed subquery)