2016-09-27 83 views
0

我有一个查询,真的很慢,我不知道为什么,每个连接字段都有索引。为什么mysql没有使用索引

这是我的查询:

SELECT 
    CASE 
     WHEN 
      arrears_action.executed IS NULL 
       OR arrears_action.executed != '0000-00-00 00:00:00' 
     THEN 
      'No action' 
     ELSE DATE_FORMAT(arrears_action.planned, '%d %M %Y') 
    END, 
    CASE 
     WHEN 
      arrears_action.executed IS NULL 
       OR arrears_action.executed != '0000-00-00 00:00:00' 
     THEN 
      NULL 
     ELSE IF(DATEDIFF(NOW(), arrears_action.planned) >= 0, 
      DATEDIFF(NOW(), arrears_action.planned), 
      NULL) 
    END, 
    customer.id AS customer_id, 
    customer.customer_number AS cif_number, 
    arrears_application.id AS arrears_application_id, 
    person.id AS person_id, 
    person.fullname, 
    account.account_number, 
    CONCAT(branch.branch_id, 
      product.code, 
      SUBSTRING(contract.loan_number, - 9, 9)) AS loan_account, 
    payment.principal_amount_outstanding, 
    arrears.amount_in_arrears, 
    arrears.days_in_arrears, 
    balance.account_balance_available, 
    product.code AS product_code, 
    division.name AS division_name, 
    coll_customer_status.name AS customer_status, 
    loan_status.name AS loan_status 
FROM 
    cregora_cregora.base_cregora_loancontract_inarrears_data AS arrears 
     INNER JOIN 
    cregora_cregora.base_cregora_loancontract_data AS contract ON contract.id = arrears.loancontract_id 
     INNER JOIN 
    cregora_cregora.base_cregora_loancontract_payment_data AS payment ON payment.loancontract_id = contract.id 
     INNER JOIN 
    cregora_cregora.base_cregora_nmb_product_class_data AS product ON product.id = contract.product_class 
     INNER JOIN 
    cregora_cregora.base_cregora_account_data AS account ON account.id = contract.account_id 
     INNER JOIN 
    cregora_cregora.base_cregora_customer_data AS customer ON customer.id = account.customer_id 
     INNER JOIN 
    cregora_cregora.base_cregora_person_data AS person ON person.id = customer.type_of_customer_id 
     INNER JOIN 
    cregora_base.system_organization_division AS division ON division.id = contract.loan_branch 
     INNER JOIN 
    cregora_cregora.base_cregora_nmb_branch_data AS branch ON branch.id = division.entity_instance_id 
     INNER JOIN 
    cregora_cregora.base_cregora_account_balanceinfo_daily_data AS balance ON balance.account_id = account.id 
     LEFT JOIN 
    cregora_cregora.base_cregora_arrears_applications_data AS arrears_application ON arrears_application.loan_contract_number = contract.loan_number 
     LEFT JOIN 
    cregora_cregora.base_cregora_arrears_action_data AS arrears_action ON arrears_action.arrears_application_id = arrears_application.id 
     LEFT JOIN 
    cregora_cregora.base_cregora_collection_applications_data AS coll_application ON coll_application.arrears_application_id = arrears_application.id 
     LEFT JOIN 
    cregora_cregora.base_cregora_collection_customer_statuses_data AS coll_customer_status ON coll_customer_status.id = coll_application.collection_customer_status_id 
     LEFT JOIN 
    cregora_cregora.base_cregora_arrears_loan_contract_statuses_data AS loan_status ON loan_status.id = arrears_application.loan_contract_status_id 
     LEFT JOIN 
    cregora_cregora.base_cregora_arrears_application_statuses_data AS arrears_status ON arrears_status.id = arrears_application.arrears_application_status_id 
WHERE 
    contract.loan_branch IN (46) 
     AND (coll_customer_status.id IN ('1' , '2', 
     '3', 
     '5', 
     '6', 
     '7', 
     '8', 
     '9', 
     '10', 
     '11', 
     '12', 
     '13', 
     '15', 
     '16', 
     '17', 
     '18', 
     '19', 
     '20', 
     '21', 
     '22', 
     '23') 
     OR coll_customer_status.id IS NULL) 
     AND (loan_status.id IS NULL 
     OR loan_status.id IN ('1' , '2', '3', '4', '5')) 
     AND arrears.amount_in_arrears > '1' 
GROUP BY arrears_application.id 
ORDER BY arrears.days_in_arrears DESC , person.fullname 

这是的EXPLAIN输出: explain 为什么MySQL的不使用任何合同表的索引(解释三线,类型 - > ALL ,可能的密钥 - >主,ACCOUNT_ID,loan_branch,product_class键 - >空

日Thnx提前

+1

请你让你的解释更具可读性。它可能不会使用索引,因为它不是必需的!为什么你关心它是查询速度慢?如果是这样给定时间,并且还指示每个表中的行数 – e4c5

+0

使用图片而不是文本输出,则您可以看到合同表未使用任何索引。它正在进行全表扫描。记录的数量不确定,因为即时通讯仍然导入实际的测试数据,但有很多。在生产这个查询将运行5分钟左右。附加说明:当删除组和by order子句时,查询会降低到第二个 – user2988167

+0

以下毫无意义的任何分析,而大量的导入操作已在运行 – e4c5

回答

0

是,arrears_application_data表留下的问题加入也狮? d通过。这导致了显着的性能下降

相关问题