如何优化左连接查询?

时间:2010-10-22 18:06:16

标签: optimization mysql left-join

我有两个表,jos_eimcart_customers_addresses和jos_eimcart_customers。我想从customers表中提取所有记录,并在地址表中包含可用的地址信息。查询确实有效,但在我的localhost机器上运行需要一分钟。在localhost上,每个表大约有8000行,但在生产中,每个表最多可以有25,000行。有没有办法优化这个,所以它不需要那么长时间?两个表都在id字段上有一个索引,它是主键。我需要创建一些其他索引来帮助它更快地运行吗?地址表是否应该在customer_id字段上有索引,因为它是外键?我有其他类似的数据库查询,可以更快地在更大的表上运行。

(编辑添加:每个客户可以有多个地址记录,因此customer_id不是地址表中的唯一值。)

select 
    c.firstname,
    c.lastname,
    c.email as customer_email, 
    a.email as address_email,
    c.phone as customer_phone,
    a.phone as address_phone,
    a.company,
    a.address1,
    a.address2,
    a.city,
    a.state,a.zip, 
    c.last_signin
from jos_eimcart_customers c
    left join  jos_eimcart_customers_addresses a  
    on c.id = a.customer_id  
order by c.last_signin desc

编辑添加:解释结果

id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra
==========================================================================================
1  | SIMPLE      |  c    |  ALL |   NULL        | NULL| NULL    |NULL |6175  |Using temporary; Using filesort
---------------------------------------------------------------------------------------
1  | SIMPLE      |  a    |  ALL |   NULL        | NULL| NULL    |NULL |8111  |

2 个答案:

答案 0 :(得分:6)

您应该在a.customer_id上创建索引。它不需要是唯一索引,但它绝对应该被索引。

尝试创建索引并查看它是否更快。为了进一步优化,您可以使用SQL的EXPLAIN来查看您的查询是否正在使用索引。

请尝试http://www.dbtuna.com/article.asp?id=14http://www.devshed.com/c/a/MySQL/MySQL-Optimization-part-1/2/获取有关EXPLAIN的一些信息。

答案 1 :(得分:4)

简短回答:是的,customer_id应该有索引。

更好的答案:最好为MySql找到一个查询分析器,并用它来确定减速的实际原因是什么。

例如,你可以在选择之前放置EXPLAIN,看看结果是什么。

Optimizing MySQL: Queries and Indexes

相关问题