【问题标题】:Left join query is executing very slow for large data in tables对于表中的大数据,左连接查询执行速度非常慢
【发布时间】:2013-09-09 07:07:32
【问题描述】:

以下是我的查询,我在 navicat my sql 中对包含超过 91000 条记录的表执行。

select l.* 
from localcdrsmem l 
LEFT JOIN (
         SELECT LocalCDRID, ForeignCDRsID 
         from localcdrsmem l 
         INNER JOIN foreigncdrsmem f 
         ON l.CalledNumber=f.CalledNumber and 
         ABS(l.Duration-f.Duration)<= 2 and            
         ABS(TIMESTAMPDIFF(SECOND,f.StartTime,l.StartTime))<=100 
         group by l.CalledNumber) 
as temp ON l.LocalCDRID = temp.LocalCDRID 
where temp.LocalCDRID IS NULL;

表格是:

localcdrsmem - > 
+---------+------------+--------+----------
localcdrid | callednumber | duration | starttime
+---------+------------+--------+----------+
foreigncdrsmem- > 
+------------+------------+--------+----------
foreigncdrid | callednumber | duration | starttime
+---------+------------+--------+----------+

对优化这个查询有什么想法吗??

【问题讨论】:

  • 我猜是在 join 子句中使用了数学和函数,但你能给我们EXPLAIN 的输出吗?
  • 与整个事情相比,内部查询需要多少时间?
  • 我实际上想从第一个表 localcdrsmem 中获取那些不存在于通过子查询连接到它的表中的记录。
  • 内部查询需要将近 1.481 秒来执行
  • 这些不是表定义。添加SHOW CREATE TABLE localcdrsmem;SHOW CREATE TABLE foreigncdrsmem;的输出

标签: mysql sql performance query-optimization


【解决方案1】:
select l.* from localcdrsmem l LEFT JOIN 
(SELECT LocalCDRID, ForeignCDRsID from localcdrsmem l 
INNER JOIN foreigncdrsmem f
ON l.CalledNumber=f.CalledNumber 
WHERE ABS(l.Duration-f.Duration)<= 2 
and ABS(TIMESTAMPDIFF(SECOND,f.StartTime,l.StartTime))<=100 
group by l.CalledNumber) as temp
ON l.LocalCDRID = temp.LocalCDRID where temp.LocalCDRID IS NULL;

试试上面的这个查询。此查询执行得更快。只需在该语句ON l.CalledNumber=f.CalledNumber 之后使用where 子句更改and 语句。您可以看到我们的查询之间的区别。

【讨论】:

  • 为什么会有区别?
  • 区别只是执行时间
猜你喜欢
  • 2010-12-07
  • 2017-03-26
  • 1970-01-01
  • 1970-01-01
  • 2012-06-30
  • 1970-01-01
  • 2013-01-27
  • 2015-12-03
  • 2016-09-05
相关资源
最近更新 更多