如何优化查询

时间:2011-04-18 09:10:21

标签: mysql

我当前的查询如下所示:

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秒的最大执行时间。但对于小查询我得到的结果在我的浏览器。任何人都可以优化我上面给出的查询。

4 个答案:

答案 0 :(得分:1)

您一次又一次地加入user_id和名称。您可能缺少适当的索引

CREATE INDEX uservar_user_id_name ON uservar (user_id, name);

但是,如果您创建一个包含user_id,billingLastName,billingMobile,billingCity,billingState,billingAddress和billingFirstName列的表,而不是将它们放在uservar表的不同行中,那么您将获得更多更好的性能。

答案 1 :(得分:0)

您可以在id和name列上的userdb.uservar上放置索引,因为大多数连接都在这些

答案 2 :(得分:0)

如果尚未使用,

Indexes可能会有很大的帮助。

答案 3 :(得分:0)

您需要“uservar”(user_id,name)

的索引

你似乎正在做一个潜在的大交叉连接,这可能会使事情变得相当缓慢。 “userdb.user u,userdb.paymentgatewaytracker pg, oms.deliverymode od,oms.paymentmode op“

我建议您为加入发布“解释选择...”。