我只是数据库中的一个问题 - 将它们用于基本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点。
答案 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)
并在服务器端代码中加入这两个列表
或者您可以创建虚拟表来执行相同的操作,但在数据库端