【发布时间】:2011-04-29 07:36:48
【问题描述】:
我有两个表,jos_eimcart_customers_addresses 和 jos_eimcart_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 |
【问题讨论】:
标签: optimization mysql left-join