代码之家  ›  专栏  ›  技术社区  ›  kilrizzy

慢速查询-多个联接和大量数据

  •  1
  • kilrizzy  · 技术社区  · 16 年前

    我相信有更好的方法可以做到这一点。我有三个要运行大量数据的主表: 记录销售和预约。每个都有近20000条记录。

    我需要加入这三张桌子,还有一些不是两张大的桌子。

        $SQL = "SELECT DISTINCT appointments.id AS aid, appointments.date, appointments.estimate_price, appointments.next_action, appointments.next_action_date, appointments.result, appointments.result_type, appointments.notes,
    customer.id AS cid, customer.homeowner1_fname, customer.homeowner1_lname, customer.address, customer.city, customer.state, customer.zipcode, customer.phone1, customer.phone1_type, customer.phone2, customer.phone2_type, customer.phone3, customer.phone3_type, customer.phone4, customer.phone4_type, customer.phone5, customer.phone5_type, customer.lead_source, customer.lead_category, customer.primary_interest, customer.secondary_interest, customer.additional_interest1, customer.additional_interest2,
    originator.employee_id AS originator_employee_id,originator.fname AS originator_fname,originator.lname AS originator_lname,
    setter.employee_id AS setter_employee_id,setter.fname AS setter_fname,setter.lname AS setter_lname,
    resetter.employee_id AS resetter_employee_id, resetter.fname AS resetter_fname, resetter.lname AS resetter_lname,
    salesrep.employee_id AS salesrep_employee_id, salesrep.fname AS salesrep_fname, salesrep.lname AS salesrep_lname,
    salesrep2.employee_id AS salesrep2_employee_id, salesrep2.fname AS salesrep2_fname, salesrep2.lname AS salesrep2_lname
    FROM
    core_records_appointments as appointments
    INNER JOIN core_records_main as customer ON appointments.customer = customer.id
    LEFT JOIN core_employees_main as originator ON appointments.originator = originator.id
    LEFT JOIN core_employees_main as setter ON appointments.setter = setter.id
    LEFT JOIN core_employees_main as resetter ON appointments.resetter = resetter.id
    LEFT JOIN core_employees_main as salesrep ON appointments.sales_representative = salesrep.id
    LEFT JOIN core_employees_main as salesrep2 ON appointments.sales_representative2 = salesrep2.id
     ";
    

    这需要几秒钟的时间,但最终会加载。不过,我最后提出的联接似乎将查询拆分在一起:

    LEFT JOIN core_records_sales as sales ON appointments.day = sales.day_sold AND appointments.customer = sales.customer
    

    在这之后,我有了一个限制和一个分组依据

    我能做些什么来改善这个?我在使用jqgrid,不确定这是否有帮助

    2 回复  |  直到 14 年前
        1
  •  5
  •   Dan Soap    16 年前

    作为第一种方法,尝试使用explain语法对数据库执行查询。这将给您一个对语句的分析,并告诉您它是否使用索引。如果它没有使用索引或索引不足,请尝试将它们添加到表中。

        2
  •  1
  •   Yada    16 年前

    您是否尝试对所有要加入的列提供索引?

    如果还没有声明为索引,请尝试为所有这些项提供索引