2014-11-07 4 views
0

я пишу запрос MySQL, как показано ниженужна помощь в оптимизации MySQL Query

SELECT `user_master`.`first_name`, 
     `city_name`, 
     `user_master`.`last_name`, 
     `user_master`.`user_master_id`, 
     `account_management_master`.`account_name`, 
     `donation_receipt_info`.`receipt_temple_id`, 
     date(dt) AS dt, 
     SUM(`donation_receipt_info`.`amount`) AS amount 
FROM (`donation_receipt_info`) 
JOIN `donation_receipt_master` ON donation_receipt_master`.`receipt_id`=`donation_receipt_info`.`receipt_id` 
JOIN `account_management_master` ON `account_management_master`.`account_id`=`donation_receipt_info`.`account_id` 
JOIN `user_master` ON `user_master`.`user_master_id`=`donation_receipt_master`.`user_master_id` 
JOIN `user_address_info` ON `user_address_info`.`user_master_id`=`user_master`.`user_master_id` 
JOIN `city_master` ON `city_master`.`city_id`=`user_address_info`.`city_id` 
WHERE `donation_receipt_info`.`temple_id` = '1' 
GROUP BY `donation_receipt_info`.`receipt_id`, 
     `donation_receipt_info`.`account_id` 

стол donation_receipt_info и мастер имеют около 42K результатов запроса предпринимает путь много времени, примерно от 5 до 6 минут для выполнения в mysql. может кто-то, пожалуйста, помогите мне оптимизировать запрос, любая помощь или предложение будут очень полезны Спасибо.

+3

Посмотрите на вывод EXPLAIN, посмотрите, какие индексы присутствуют/отсутствуют –

ответ

1

Во-первых, ваш запрос невозможно прочитать. Вы должны отформатировать его и научиться использовать псевдонимы таблицы:

SELECT um.first_name, city_name, um.last_name, um.user_master_id, amm.account_name, 
     dri.receipt_temple_id, date(dt) AS dt, SUM(dri.amount) AS amount 
FROM donation_receipt_info dri JOIN 
    donation_receipt_master drm 
    ON drm.receipt_id = dri.receipt_id JOIN 
    account_management_master amm 
    ON amm.account_id = dri.account_id JOIN 
    user_master um 
    ON um.user_master_id = drm.user_master_id JOIN 
    user_address_info uai 
    ON uai.user_master_id = um.user_master_id JOIN 
    city_master cm 
    ON cm.city_id = uai.city_id 
WHERE dri.temple_id = '1' 
GROUP BY dri.receipt_id, dri.account_id; 

Дальше. У всех таблиц есть очевидные индексы? То есть, каждая таблица имеет идентификатор, и они должны быть объявлены как ключи (предпочтительные первичные ключи). Например, city_master(city_id).

Далее должен быть указатель на donation_receipt_info(temple_id, receipt_id, account_id). Это должно помочь с where. Примечание: если temple_id действительно целое число, то предложение where должно быть выражено как WHERE dri.temple_id = 1 - никаких кавычек. Вы не хотите, чтобы MySQL запутался и решил не использовать индекс.

Эти изменения, вероятно, помогут. 5-6 минут, похоже, долгое время для такого запроса.

+0

Интересно, как разные люди имеют разные предпочтения. Я, например, думал, что формат OP намного проще, потому что ключевое слово JOIN всегда слева. – AdamMc331

+1

@ McAdam331. , , Исходный вопрос не был отформатирован; форматирование в вопросе, очевидно, было сделано pagogomez. –

+0

Я даже не думал смотреть. Виноват! Хотя, я полагаю, мой комментарий все еще держится. – AdamMc331

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