Optimized MySQL "optional" FULLTEXT search on multiple tables
Wrong approach.  Instead, "construct" the SELECT based on which fields the user provides.

Why?  OR does a poor job of optimizing.  If, instead, you remove the clause from WHERE, you don't need the test for 0, thereby avoiding the OR.

Worse yet is an OR spanning multiple tables, as you need to to with the FULLTEXT checks.  The only way for the query, as it stands, to be run is to evaluate all combinations of all rows in all tables, then start filtering.  (OK, I exaggerate, but not by much.)

A common way to avoid OR is to turn it into UNION:

( SELECT id FROM a WHERE MATCH(a...) ... )
UNION DISTINCT
( SELECT id FROM a JOIN b ON ... WHERE MATCH(b...) ... )
...


That will get all the possible values for a.id.

Why LEFT?  That will slow down the 2nd and 3rd parts of the subquery for no good reason.  Remove LEFT.  If there is no b row, that's equivalent to the MATCH failing.

Then, put that in a subquery to get the rest of the desired data:

SELECT a.id, a.title, b.txt AS b_txt, c.txt AS c_txt 
FROM ( the above "union" query ) AS tmp
JOIN a 
LEFT JOIN b ON a.b_id=b.id 
LEFT JOIN c ON a.c_id=c.id;


In this case you might need LEFT; but remove it if you don't.

Other notes

While you are 'constructing' the query, you may as well plug in the @ values.  @variables inhibit the optimizer in some cases; actual literals are more easily processed.  Be sure to escape them to help prevent "sql injection".

In case it was not obvious, 0=@bid OR goes away.