这个MySQL多表连接好吗?

时间:2012-10-08 20:53:15

标签: mysql

我有一个表service_contacts,可以包含listids表中的lists和来自contactids表的contactscontact_list_relationship具有contactslists表之间的关系。

我正在尝试提取contactid service_contactslistid(每个列表中包含contactids)的所有联系人。< / p>

SELECT d.* FROM service_contacts a 
LEFT JOIN lists b 
    ON a.calllistid=b.listid
LEFT JOIN contact_list_relationship c 
    ON c.listid=b.listid
INNER JOIN contacts d
    ON d.contactid=c.contactid OR d.contactid=a.contactid
WHERE a.memberid=12345

这会运行,并提取预期结果。到目前为止......我只是想知道是否有更好的方法。

1 个答案:

答案 0 :(得分:2)

假设您加入的字段已编入索引/或最好使用FOREIGN KEY约束(强制执行索引)定义,您应该没问题。

然而,MySQL并不总是使用索引,即使它们可用。要检查索引是否正在使用,您可以在语句上运行解释,即

EXPLAIN 
SELECT d.* FROM service_contacts a 
LEFT JOIN lists b 
    ON a.calllistid=b.listid
LEFT JOIN contact_list_relationship c 
    ON c.listid=b.listid
INNER JOIN contacts d
    ON d.contactid=c.contactid OR d.contactid=a.contactid
WHERE a.memberid=12345;

结果将通知您在语句中使用了哪些索引。如果结果不符合预期,您可以强制Mysql使用索引,并在每次引用表后声明'force key for join indexname