Mysql внутренний запрос количества соединений слишком медленный - PullRequest
0 голосов
/ 14 сентября 2018

Я пытаюсь получить количество запросов с помощью простого предложения внутреннего соединения.Я создал индекс для всех атрибутов.Запрос очень медленный: (12 секунд).У меня 4 миллиона записей в таблице 1 и таблице 2. Это мой запрос:

 select count(*)
 from (`mymodb`.`Table1`
     join `mymodb`.`Table2` on ((`mymodb`.`Table2`.`id` =`mymodb`.`Table1`.`id_table1`)))
 where (`mymodb`.`Table2`.`merchant_id` = 16444)
   and Table1.created_at >= '2017-12-03 16:00:19' AND  Table1.created_at <='2018-05-03 16:00:19';

Это команда запроса desc (см. 5.524.164 записи):

1   SIMPLE  Table1      ALL Table12_index,Table16_index             5524164 21.38   Using where
1   SIMPLE  Table2      eq_ref  PRIMARY,idx_Table2_id-uniq,Table26_index    PRIMARY 8   mymodb.Table1.id_table1 1   50  Using where

Таблица2

Какой наилучший способ получить запрос подсчета с внутренним объединением двух таблиц (Таблица 1 - Таблица 2).12 секунд очень плохое время для моего процесса.

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Вы пытаетесь объединить таблицу с ключевым словом join, которое означает, что применяется перекрестное объединение. Перекрестные соединения обычно медленнее внутренних соединений.

И еще одна вещь, когда вы хотите использовать внутреннее соединение, почему вы ставите условие, где. Также применяется перекрестное соединение.

Попробуйте этот запрос:

select count(*)
 from (`mymodb`.`Table1`
     inner join `mymodb`.`Table2` on ((`mymodb`.`Table2`.`id` =`mymodb`.`Table1`.`id_table1`)))
 ON (`mymodb`.`Table2`.`merchant_id` = 16685)
   and Table1.created_at >= '2017-12-03 16:00:19' AND  Table1.created_at <='2018-05-03 16:00:19';

Надеюсь, что это работает.

Спасибо

0 голосов
/ 14 сентября 2018

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

Вам определенно потребуется создать индекс для merchant_id для table2 (если у вас его нет),Затем вам нужно проанализировать ваш запрос.Убедитесь, что у вас есть комбинированный индекс для полей, которые вы запрашиваете.Вы должны получить увеличение производительности на несколько порядков.

...