SQL Left Join。花费太长时间。

时间:2013-07-26 14:25:24

标签: mysql sql join left-join primary-key

好的,这是我的表格模式 我有2张桌子。说表A和表B.表A的主键是PriKeyA bigint(50),表B的主键是PriKeyB varchar(255)。 PriKeyA和PriKeyB都包含相同类型的数据 此问题所需的表A的相关字段是Last_login_date_in_A(日期),表B是主键本身。
我需要做的是,将A中的PriKeyA放在表B的PriKeyB列中,并且Last_login_date_in_A列应该比当前日期大30天。基本上我需要表A和表B的差异以及某个条件(这个问题的日期)
这是我的SQL命令

: SELECT A.PriKeyA from A  
 LEFT JOIN B ON A.PriKeyA = B.PriKeyB   
 WHERE B.PriKeyB IS NULL and DATEDIFF(CURRENTDATE,Last_login_date_in_A)>30;

然而,当我运行这个MySQL命令时,它需要非常长的时间(大约3个小时)。表A的大小为2,50,000,表B的大小分别为42,000。我认为这个问题可能是由于PriKeyA和PriKeyB是不同的数据类型。所以我也在查询中使用了CAST(PriKeyB as unsigned)。但这也行不通。性能略有改善。

可能出现的问题是什么?我之前使用过Left Joins,他们从来没有用过这么久。

1 个答案:

答案 0 :(得分:3)

查询的费用似乎是出于以下原因:

  • A的PK和B的PK的SQL数据类型不一样。
  • 表A可能没有Last_login_date_in_A
  • 的索引

这意味着表A中的所有行必须一次检查一行,以确定是否>> 30天前的标准是真实的。如果A有2,500,000行(通过如何在A的行数中放置逗号来证明)而不是250,000行,则尤其如此。

在Last_login_date_in_A上添加索引可能会对此有所帮助,但由于需要更新其他索引,也会略微减慢表的插入/更新/删除语句时间。

此外,您应该利用文档为您的查询解释MySQL的实际选择查询计划:MySQL query plan documentation