Вы уверены, что это запрос, который вы хотите? Вы знаете, что первое условие ИЛИ даже не определило соединение, поэтому оно будет выполнять декартово соединение для всех таблиц. Я не уверен, что это так, и вы не ожидаете, что критерии соединения будут выполнены для этого условия ИЛИ. Потому что, похоже, ваши столбцы выбора из нескольких таблиц предполагают, что вы ожидаете какое-то соединение, и если это так, вам следует начать с запроса, который выглядит следующим образом ..
SELECT a.id,
a.filetype,
a.uploadtime,
a.filename,
a.userid,
a.cid,
ui.username,
company.name companyname,
a.screenname
FROM tm_transactionlog a,
tm_userinfo ui,
tm_company company,
tm_airlinecompany ac
WHERE a.userid = ui.id
AND a.cid = company.id
AND company.specificcid = ac.id
AND ( a.cid = 3049
OR ac.servicecid = 3049
OR ui.cid = 3049 );
А что касается оптимизации этого запроса, я думаю, что очень мало возможностей для оптимизации без изменения модели данных. Если у вас уже нет индексов, я бы предложил создать составной индекс (a.userid, a.cid <- столбец с большим количеством элементов должен идти первым), а индексы - ac.cservicecid, company.specificcid & ui .cid. </p>