Оптимизируйте MySql Query - avg () с внутренним объединением, занимающим больше времени - PullRequest
0 голосов
/ 18 декабря 2018

Больше времени при усреднении с внутренним объединением, если я хочу запросить 100+ деревень avg (), это займет серьезное время:

select avg(audit_main.score)
from `audit_main`
inner join `farmer_details` on `audit_main`.`id` = `farmer_details`.`audit_main_id` 
inner join `farmers` on `farmer_details`.`farmer_id` = `farmers`.`user_id`  
inner join `address` on `farmers`.`address_id` = `address`.`id`  
where `audit_main`.`certification_id` = 4
     and `farmer_details`.`mill_id` = 22  
     and `farmer_details`.`administrative_division_id` = 166
     and `address`.`village_id` = 139543;

enter image description here

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Я предлагаю следующие индексы:

audit_main: (certification_id, id)
farmer_details: (audit_main_id, farmer_id, mill_id, administrative_division_id)
farmer_details: (mill_id, administrative_division_id, audit_main_id, farmer_id)
farmers: (user_id, address_id)
farmers: (address_id, user_id)
address: (village_id, id)

Это позволяет оптимизатору начинать с разных таблиц, возможно, находя лучший порядок для их просмотра.Кроме того, многие «покрывают», что дает еще один импульс.

(Это поможет увидеть SHOW CREATE TABLE.)

0 голосов
/ 18 декабря 2018

MySQL использует 1 индекс на таблицу в запросе.

Чтобы запустить индексы, посмотрите, какие элементы содержатся в предложении WHERE.

Это означает, что должно быть:

  • audit_main, который начинается с certification_id;
  • farmer_details, который начинается с mill_id, administrative_division_id (любой порядок);и
  • address, который начинается с village_id

Затем посмотрите, к каким таблицам они присоединены, и если это не первичный ключ, добавьте это:

  • audit_main имеет id, который, поскольку предполагается, что он является PK, добавлять не нужно.
  • farmer_details имеет farmer_id (предполагается, что PK)
  • address имеет id, предполагается, что PK,
  • farmer имеет address_id и user_id (предполагается PK)

Наконец, посмотрите на набор результатов.В этом случае только audit_main.score, к которому можно добавить поле малой длины.

Итак, предположим, что индексы еще не существуют:

CREATE INDEX idxCertScore ON audit_main (certification_id,score);
CREATE INDEX idxMillAdminDiv ON farmer_details (mill_id, administrative_division_id);
CREATE INDEX idxAddress ON farmer ( address_id);
CREATE INDEX idxVillage ON address (village_id );

После добавления этих индексов покажитеEXPLAIN SELECT ... запрос, чтобы увидеть, все ли они используются правильно.

Ссылки:

...