2011-04-18 60 views
0

我当前的查询是这个样子:如何优化查询

SELECT distinct pg.id,pg.email,pg.theme,op.PaymentMode,od.DeliveryMode,uv1.value AS FirstName, uv2.value AS LastName, uv3.value AS Mobile, uv4.value AS City, uv5.value AS State, uv6.value AS Address 
FROM userdb.user u,userdb.paymentgatewaytracker pg, 
oms.deliverymode od,oms.paymentmode op, 
userdb.uservar uv1 
JOIN userdb.uservar uv2 ON uv1.user_id = uv2.user_id 
AND uv2.name = 'billingLastName' 
LEFT JOIN userdb.uservar uv3 ON uv1.user_id = uv3.user_id 
AND uv3.name = 'billingMobile' 
JOIN userdb.uservar uv4 ON uv1.user_id = uv4.user_id 
AND uv4.name = 'billingCity' 
JOIN userdb.uservar uv5 ON uv1.user_id = uv5.user_id 
AND uv5.name = 'billingState' 
JOIN userdb.uservar uv6 ON uv1.user_id = uv6.user_id 
AND uv6.name = 'billingAddress' 
where uv1.name = 'billingFirstName' 
AND u.id = uv1.user_id 
AND u.email=pg.email 
and op.PaymentModeId=pg.paymethod 
and od.DeliveryModeId=pg.deliveryOption 
ORDER BY pg.id 

这是给我正确的结果,而我检查我的本地主机。但我想在我的浏览器中显示。而我正在尝试这样做时,它显示致命错误:超过30秒的最大执行时间。但对于小型查询,我正在浏览器中获取结果。任何人都可以优化我上面给出的查询。

+0

您是否索引了所有适当的列? – 2011-04-18 09:13:02

+0

请显示你的解释结果,tkx – Neo 2011-04-18 09:16:19

回答

0

你可以把一个索引上的标识和名称的列userdb.uservar因为大多数的连接是这些

+0

你能否给我写一个优化查询。 – pritosh 2011-04-18 09:16:45

0

Indexes如果尚未使用的可能是很大的帮助在这里。

1

您加入user_id并重复名称。你可能会缺少一个适当的索引

CREATE INDEX uservar_user_id_name ON uservar (user_id, name); 

但是,如果你创建一个表中的列的user_id,billingLastName,billingMobile,结算城市,billingState,billingAddress和billingFirstName而不是单独的有他们,你会得到更好的性能uservar表中的行。

0

你需要一个指数的“USERVAR”(USER_ID,名)

你似乎是在做一个潜在的大CROSSJOIN可能慢下来不少。 “userdb.user U,userdb.paymentgatewaytracker PG, oms.deliverymode OD,oms.paymentmode OP”

我建议你张贴 “解释选择...” 的加入。