缩短连接查询

时间:2012-03-16 15:46:30

标签: mysql

我有3个连接的查询:

SELECT t1.email, t2.firstname, t2.lastname, t4.value
FROM t1
left join t2 on t1.email = t2.email
Inner join t3 on t2.entity_id = t3.order_id
Inner join t4 on t3.product_id = t4.entity_id
WHERE t4.attribute_id = 126

我认为我的服务器无法做到:) - >时间不多了所以发生错误!

非常感谢

表结构:

T1: 电子邮件(与t2相同)

T2: email firstname lastname orderid(在t3中称为实体id)

T3: entityid产品ID(在t4中称为实体ID)

T4: entityid属性值

3 个答案:

答案 0 :(得分:1)

除非t2直接链接到t4,否则没办法。

另外,你需要在t1和t2之间进行左连接吗?

答案 1 :(得分:0)

正如@Sachin所述,除非t2直接链接到t4,否则您无法“缩短”此查询,而无需与t3进行比较。但是,为了加快查询速度,您应该在连接条件中引用的部分或全部列上具有索引(即t1.emailt2.emailt2.entity_id等。< / p>

在每个列上都有一个索引可以为您提供更快的SELECT次查询,但会降低您的INSERTUPDATE次查询速度。因此,如果SELECTINSERTUPDATE更频繁,那么您肯定应该使用索引。如果没有,请尝试在明智的位置创建索引(具有INSERTUPDATE语句的表运行频率较低,但仍然有很多行。)

有关进一步说明,请参阅以下链接:

More information on how indexes work

Syntax for creating indexes

答案 2 :(得分:0)

以这种方式尝试查询:

SELECT t1.email, t2.firstname, t2.lastname, t4.value
FROM t4
INNER JOIN t3 ON t3.product_id = t4.entity_id
INNER JOIN t2 ON t2.entity_id = t3.order_id
INNER JOIN t1 ON t1.email = t2.email
WHERE t4.attribute_id = 126    

这基本上是你的查询,但“向后”。您的原始方式是,您的DBMS必须尝试将t2连接到t1中的所有记录,然后加入t3以获取在t2中找到的所有记录,甚至可以尝试解决您的WHERE子句。

我的方式是,您首先在t4找到attribute_id = 126的所有记录,然后尝试加入其他表格。它应该快得多。然后,您应该通过确保所涉及的表上存在正确的索引来进一步加快速度。您可以在查询前添加关键字EXPLAIN,以查看DBMS如何尝试在查询中搜索数据。