2014-02-14 32 views
1

我正在處理一個現有的項目,一切工作正常,但現在該網站包含超過200,000條記錄。現在我遇到了性能問題。現在,當我嘗試從表中獲取記錄時,即使我在查詢中使用了分頁,也需要20多分鐘來獲取記錄。以下是我使用左連接從多個表中獲取記錄的查詢。優化超過200,000條記錄的查詢

SELECT cus.sl_no, cus.customer_name, ccd.address, ccd.mobile_no, ccd.residence_no, 
      ccd.office_no,id.customer_id,cid.manufacturer,cid.model,cid.model_year, 
      cid.vin_no,cid.renewal_insurance_date,cid.insurance_company, 
      cid.cr_no,cid.inhouse_outside,cid.sales_consultant_name, 
      cid.sales_consultant_contact_no,cid.insurance_date, 
      cid.vehicle_registration_no  
    FROM customer_insurance_details cid 
    LEFT JOIN call_allotment_ref_admin admin 
     ON cid.customer_id = admin.customer_id 
    LEFT JOIN customer as cus 
     ON cid.customer_id = cus.customer_id 
    LEFT JOIN customer_contact_details as ccd 
     ON cid.customer_id = ccd.customer_id 
    WHERE admin.alloted_date IS NULL 
     AND cid.manufacturer='"+mf+"' 
     AND cid.renewal_insurance_date = '"+mnth+"' 
    limit "+pageNo+",100 

該查詢基於製造商和月份的客戶,customer_insurance_details和customer_contact_details獲取記錄customer_insurance_details和 連接客戶和customer_contact_details。

還有一個表call_allotment_ref_admin,在這兩個表cutomer_insurance_details/call_allotment_ref_admin有共同的customer_id,現在當我運行查詢在call_allotment_ref_admin客戶不應該在customer_insurance_details可見。

如果在call_allotment_ref_admin以及customer_insurance_details中有一個101 customer_id,那麼當我將抓取記錄時,該顧客應該不可見。

這是一個現有的項目,我不允許添加或刪除表中的任何列,只有我需要優化查詢並使結果獲取速度更快。

如果你能提供一些這方面的信息,我會非常感激。

客戶

sl_noint(10) NOT NULL 
    customer_idvarchar(20) NOT NULL 
    customer_namevarchar(100) NULL 
    create_timedatetime NOT NULL 
    last_update_timedatetime NOT NULL 

Customer_contact_details

sl_noint(10) NOT NULL 
    customer_idvarchar(20) NOT NULL 
    addressvarchar(400) NULL 
    cityvarchar(50) NULL 
    statevarchar(50) NULL 
    pin_codevarchar(15) NULL 
    countryvarchar(50) NULL 
    emailvarchar(200) NULL 
    mobile_novarchar(100) NULL 
    residence_novarchar(100) NULL 
    office_novarchar(100) NULL 
    create_timedatetime NOT NULL 
    last_update_timedatetime NOT NULL 
    vehicle_classvarchar(50) NULL 
    seating_capacityvarchar(50) NULL 
    new_emailvarchar(100) NULL 
    new_numbervarchar(50) NULL 
    cubic_capacityvarchar(50) NULL 
    special_conditionvarchar(200) NULL 
    lastyear_premiumvarchar(50) NULL 

Customer_insurance_details

sl_noint(10) NOT NULL 
    customer_idvarchar(20) NOT NULL 
    vin_novarchar(50) NOT NULL 
    insurance_datevarchar(30) NULL 
    renewal_insurance_datevarchar(30) NULL 
    insurance_companyvarchar(100) NULL 
    service_adviser_idvarchar(100) NULL 
    idv_novarchar(50) NULL 
    premiumvarchar(50) NULL 
    claim_bonusvarchar(50) NULL 
    create_timedatetime NOT NULL 
    last_update_timedatetime NOT NULL 
    sales_consultant_namevarchar(100) NULL 
    sales_consultant_contact_novarchar(50) NULL 
    customer_typevarchar(50) NOT NULL 
    vehicle_registration_novarchar(50) NULL 
    manufacturervarchar(50) NULL 
    modelvarchar(200) NULL 
    model_yearvarchar(30) NULL 
    cr_novarchar(50) NULL 
    inhouse_outsidevarchar(50) NULL 
    cover_note_novarchar(50) NULL 
    variantvarchar(50) NULL 
    call_statusvarchar(50) NULL 
    service_advisor_namevarchar(70) NULL 
    service_advisor_contact_novarchar(50) NULL 
    accessories_typevarchar(50) NULL 
    accessories_valuevarchar(50) NULL 

call_allotment_ref_admin

sl_noint(50) NOT NULL 
    user_idvarchar(100) NULL 
    permission_levelvarchar(50) NULL 
    managerIdvarchar(100) NULL 
    customer_idvarchar(100) NULL 
    call_statusvarchar(70) NULL 
    alloted_datedate NULL 
    insurance_datevarchar(30) NULL 
    customer_namevarchar(100) NULL 
    addressvarchar(200) NULL 
    mobile_novarchar(50) NULL 
    residence_novarchar(50) NULL 
    office_novarchar(50) NULL 
    manufacturervarchar(70) NULL 
    modelvarchar(200) NULL 
    model_yearvarchar(30) NULL 
    vin_novarchar(100) NULL 
    insurance_companyvarchar(100) NULL 
    cr_novarchar(100) NULL 
    sales_consultant_namevarchar(100) NULL 
    sales_consultant_contact_novarchar(50) NULL 
    inhouse_outsidevarchar(50) NULL 
    create_timedatetime NULL 
    last_update_timedatetime NULL 
    alloted_call_idvarchar(50) NULL 
    ins_monthvarchar(50) NULL 
+0

是否有您「customer_insurance_details」表中的任何索引。如果沒有,你是否允許創建索引? – Neels

+0

不,沒有任何索引創建,是的,我可以創建索引 – user3309554

+0

我注意到,當我不加入customer和customer_contact_details,我得到的結果非常快。 – user3309554

回答

1

使用下面列出的準則,您可以在主表上創建索引,在這種情況下爲'customer_insurance_details'。這應該可以幫助您減少查詢的運行時間。因此,您的查詢在不使用任何聚合函數的情況下進行了優化,並且基於幾個JOINS直接獲取列。所以我覺得索引是你唯一的選擇。

  • 您應該在 WHERE子句中經常使用的列上創建索引。
  • 您應該在經常使用 連接表的列上創建索引。
  • 您應該在ORDER BY子句中經常使用 的列上創建索引。
  • 您應該在 表中創建幾個具有相同值或唯一值的列的索引。
  • 由於全表掃描可能比編制索引的查詢要快,因此不應在小型表(使用 只有幾個塊的表)上創建索引。
  • 如果可能,請選擇一個主鍵,以最合適的順序排列行 。
  • 如果在WHERE子句中經常使用連接的 索引中的一列,請將該列首先放置在 CREATE INDEX語句中。
  • 如果連續的 索引中的多個列在WHERE子句中經常使用,請將最具選擇性的 列放在CREATE INDEX語句中。

有關創建索引,你可以通過這個手冊第語法信息:

http://www.w3schools.com/sql/sql_create_index.asp

相關問題