2016-09-27 3 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

использовал pic вместо текстового вывода, таблица контрактов не использует какой-либо индекс, как вы можете видеть. Он выполняет полное сканирование таблицы. Количество записей я еще не уверен, потому что im все еще импортирует фактические тестовые данные, но их много. При производстве этот запрос будет работать в течение 5 минут или около того. Дополнительное примечание: при удалении предложения group by и order by запрос падает до менее секунды – user2988167

+0

бессмысленно делает какой-либо анализ, пока большая операция импорта уже запущена – e4c5

ответ

0

проблема была, что таблица arrears_application_data осталась присоединилась, но и Groupe? d. Это привело к значительному снижению производительности.

Смежные вопросы