2010-07-15 66 views
0

我已经连接两个表,有数以百计的记录表中​​,并有在表十万条记录BI加入了他们内部和左加入,但它是两个slow.My查询:表连接非常慢!

SELECT 
    ch.id, 
    ch.client_client_id, 
    ch.duration, 
    ch.start, 
    ch.isread, 
    ch.prefix, 
    ucr.ucr_add_factor, 
    ucr.ucr_period, 
    ucr.ucr_cr_prefix 
FROM 
    call_history AS ch 
    LEFT JOIN tbl_usr_call_rates AS ucr 
     ON (
      ch.prefix=ucr.ucr_cr_prefix 
      AND ch.client_client_id=ucr.ucr_callshop_id 
     ) 
WHERE 
    ch.isread='0' 

如何我可以提高性能

感谢提前...

+0

你有加入他们的列的表的索引吗? – Kangkan 2010-07-15 11:12:43

+3

今天的年轻人没有历史的概念。我记得加入时意味着你必须去两个独立的文件柜并匹配纸片。为什么,如果你能在一周内完成你的加入,你是幸运的。 – 2010-07-15 11:23:31

+0

是的,我有必要的指标 – 2010-07-15 11:39:43

回答

2

检查使用的索引。你可以看到哪些是通过调用使用的

EXPLAIN SELECT 
ch.id, ch.client_client_id, ch.duration, ch.start, ch.isread, ch.prefix, 
ucr.ucr_add_factor, ucr.ucr_period, ucr.ucr_cr_prefix 
FROM call_history AS ch 
LEFT JOIN tbl_usr_call_rates AS ucr 
ON (ch.prefix=ucr.ucr_cr_prefix AND ch.client_client_id=ucr.ucr_callshop_id) 
WHERE ch.isread='0' 
+0

我已经把必要的索引 – 2010-07-15 11:35:35

+1

可以哟提供结果,如果解释......? – Lars 2010-07-15 11:41:58

+0

在解释输出中的“额外”列有“使用索引” – 2010-07-15 12:06:20

1

秋后算账:

检查指标 检查联接不需要超过一个FIEL d或者你会有笛卡尔产品

还有很多其他的,但这些是主要的。

jim

0

我认为你有这些领域的指标?

call_history.prefix 
tbl_usr_call_rates.ucr_cr_prefix 
call_history.client_client_id 
tbl_usr_call_rates.ucr_callshop_id 
call_history.isread 
+0

是这些字段的索引除了'isread' – 2010-07-15 11:38:31

0

您可以尝试在您加入的列上添加索引。

0

在加入之前先通过WHERE子句过滤,这样您可以加入已过滤的结果,而不是加入所有这些结果,然后过滤大结果。

+0

如果优化程序没有为您处理此问题,我会感到惊讶。 – spender 2010-07-15 11:20:17