У меня есть запрос, который очень медленный, и я не уверен, почему есть индексы для каждого поля объединения.Почему 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: Почему MySQL не использует какой-либо из индексов таблицы контрактов (третья строка объяснить, тип-> ALL возможные ключи -> ОСНОВНАЯ, account_id, loan_branch, product_class кнопочной> пустого
Thnx заранее
Можете ли вы объяснить, что вы объясните, пожалуйста, более читабельнее. Возможно, он не использует индекс по той простой причине, что он не нужен! Почему вас беспокоит, что запрос медленный? Если да, укажите время, а также укажите количество строк в каждой таблице. – e4c5
использовал pic вместо текстового вывода, таблица контрактов не использует какой-либо индекс, как вы можете видеть. Он выполняет полное сканирование таблицы. Количество записей я еще не уверен, потому что im все еще импортирует фактические тестовые данные, но их много. При производстве этот запрос будет работать в течение 5 минут или около того. Дополнительное примечание: при удалении предложения group by и order by запрос падает до менее секунды – user2988167
бессмысленно делает какой-либо анализ, пока большая операция импорта уже запущена – e4c5