【问题标题】:how to optimize a left join query?如何优化左连接查询?
【发布时间】: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


    【解决方案1】:

    您应该在 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 的一些信息。

    【讨论】:

    • 哇!我在 a.customer_id 上添加了一个索引,查询从 84 秒变为 0.0168 秒。大不同!
    • 仅供参考,我之所以接受这个答案而不是 darren 的答案,只是因为它比 darren 早了 2 分钟 - 两者的答案基本相同,所以没有其他方法可以决定谁赢!
    【解决方案2】:

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

    更好的答案:最好找一个MySql的查询分析器,并用它来确定慢的真正原因是什么。

    例如,您可以将 EXPLAIN 放在您的选择之前,然后查看结果。

    Optimizing MySQL: Queries and Indexes

    【讨论】:

    • 已编辑以添加 EXPLAIN 结果。
    猜你喜欢
    • 2017-04-04
    • 2019-03-08
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    • 2020-02-14
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多