用LEFT JOIN挂起的MySQL查询

时间:2012-02-15 15:08:48

标签: mysql

我只是数据库中的一个问题 - 将它们用于基本Web应用程序的后端,而不是任何企业。

我最近需要使用两个表 - 一个包含130,000行,另一个包含29,000行。他们有类似的数据,我需要用某种JOIN语句从中提取。不幸的是,这似乎会导致问题并且查询会停止并挂起。

查询如下:

SELECT * 
FROM call_status LEFT JOIN queue_log 
ON call_status.callId = queue_log.callid 
ORDER BY call_status.callId DESC limit 10;

检查进程列表时,我看到以下内容:

Query   643 Copying to tmp table    SELECT * FROM call_status LEFT JOIN queue_log ON call_status.callId = queue_log.callid ORDER BY call 

是的,查询已运行超过10分钟。

我已经运行 explain ,这就是输出:

1   SIMPLE  call_status ALL (null)  (null)  (null)  (null)  28954   Using temporary; Using filesort
1   SIMPLE  queue_log   ALL ix_queue_log_callid (null)  (null)  (null)  130419  

我在两张桌子上都运行了 SHOW INDEX ,对我来说都很好看:

call_status:

call_status 0   PRIMARY 1   callId  A   28954   (null)  (null)      BTREE   
call_status 0   ix_order_callId 1   callId  A   28954   (null)  (null)      BTREE    

queue_log:

queue_log   1   ix_queue_log_callid 1   callid  A   26083   (null)  (null)      BTREE   

我完全失去了,现在是凌晨2点。

2 个答案:

答案 0 :(得分:2)

你能试试吗?:

SELECT * 
FROM 
      ( SELECT *
        FROM call_status 
        ORDER BY callId DESC 
        LIMIT 10
     ) AS st
  LEFT JOIN 
      queue_log AS qlog 
    ON 
      st.callId = qlog.callid 
ORDER BY 
      st.callId DESC 
LIMIT 10

答案 1 :(得分:0)

尝试选择最后10个call_status

SELECT * FROM call_status ORDER BY callId DESC limit 10;

之后,在服务器端代码(php,asp,jsp,ruby)中获取所有这些id的列表(3,4,5,6,7,90)

并做

SELECT * FROM queue_log WHERE callid IN (3,4,5,6,7,90) 

并在服务器端代码中加入这两个列表

或者您可以创建虚拟表来执行相同的操作,但在数据库端