代码之家  ›  专栏  ›  技术社区  ›  Hüseyin BABAL

表连接太慢了!

  •  0
  • Hüseyin BABAL  · 技术社区  · 16 年前

    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' 
    

    如何提高性能

    谢谢你提前。。。

    5 回复  |  直到 16 年前
        1
  •  2
  •   Lars    16 年前

    检查使用的索引。您可以看到call使用了哪些

    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' 
    
        2
  •  1
  •   jim tollan    16 年前

    通常的嫌疑犯是:

    检查索引 检查联接是否不需要多个字段,否则将得到笛卡尔积

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

    吉姆

        3
  •  0
  •   spender    16 年前

    我想你有这些字段的索引吧?

    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
    
        4
  •  0
  •   Rob    16 年前

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

        5
  •  0
  •   Horrendus    16 年前

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

    推荐文章