我需要通过删除“OR”语句来跟踪SQL查询的性能调整
请帮忙......
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.CID = 3049
)
OR
(
a.CID = company.ID
AND
ac.SERVICECID = 3049
AND
company.SPECIFICCID = ac.ID
)
OR
(
a.USERID = ui.ID
AND
ui.CID = 3049
);
答案 0 :(得分:1)
您确定这是您想要的查询吗?您确实知道第一个OR条件甚至没有定义连接,因此它将对所有表执行笛卡尔连接。我不确定这是否是按设计进行的,并且您不希望OR条件满足连接条件。因为看起来您的多表选择列表明您期望某种类型的连接,如果是这种情况,您应该从看起来像这样的查询开始。
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。
答案 1 :(得分:0)
查看表结构非常有用 - 我相信你可以通过加入表来删除很多WHERE子句代码。