Нужен оптимизированный запрос MySQL - PullRequest
0 голосов
/ 23 сентября 2019

table to [optimize]

Над моей таблицей mysql.Столбец dvr_id имеет значения того же первичного ключа таблицы dealer_visit_id, а dvr_id является столбцом, допускающим значение NULL.Мне нужно получить все записи таблицы dealer_visit, что очень просто.Но суть в том, что наряду со всеми записями мне нужен столбец "count" из dvr_id, соответствующий каждой извлекаемой записи.

например: если я хочу получить записьс dealer_visit_id 2660 , я напишу запрос как

select col1,col2,col3, (SELECT count(dvr_id) from dealer_visit  where dvr_id=dealer_visit_id GROUP BY dvr_id as totalDVRs) 
 from dealer_visit;

Нужно что-то вроде этого, но запрос слишком медленный, когда я пытаюсь получить 1000+ записей.чем за 9 секунд, чтобы получить записи.Когда я удаляю запрос COUNT , он выбирает более 1000 записей в течение 1-1,5 секунды.

Как оптимизировать запрос, чтобы получать записи вместе с количеством строк в зависимости от 1 столбцазначение?

Надеюсь, в моем вопросе все ясно.

Редактировать 1: Предположим, набор данных выглядит следующим образом: Example Dataset

Теперь, если яполучить запись с dealer_visit_id 33, я должен получить строку с dealer_visit_id 33 ALONG WITH count (dvr_id), имеющим 33, как в примере набора данных Так что ожидаемый вывод для вышеуказанного набора данныхдолжно быть:

Ожидаемый вывод для запроса на выборку (с количеством столбцов dvr_id, имеющим значение 33 в качестве значения) файла dealer_visit_id = 33

|   dealer_visit_id   |   employee_id   |   originally_created_by    |   dealer_id   |   COUNT(dvr_id) |
--------------------------------------------------------------------------------
|    33               |     20          |         20                 |      226      |    6            |

Количество (dvr_id) = 6 является важной вещью в моемвопрос, который я пытаюсь получить быстро.Здесь вы видите, что в результате получается строка с dealer_visit_id = 33 и числом чего-то, что можно назвать его подстроками или связанными строками, равными 6 в соответствии с примером набора данных.

Ниже выводится таблица объяснений

Field                   Type                          Null    Key     Default  Extra           
----------------------  ----------------------------  ------  ------  -------  ----------------
dealer_visit_id         int(10) unsigned              NO      PRI     (NULL)   auto_increment  
employee_id             int(10) unsigned              NO              (NULL)                   
originally_created_by   int(10) unsigned              YES             (NULL)                   
dealer_id               int(10) unsigned              NO              (NULL)                   
dvr_id                  int(10) unsigned              YES             (NULL)                   
dealer_emo_id           bigint(10) unsigned           YES             (NULL)                   
department              enum('SALES','ASSURED','EM')  YES             (NULL)                   
dvr_type                enum('FOLLOWUP','DVR')        YES             (NULL)                   
present_members         varchar(4096)                 YES             (NULL)                   
visit_date              date                          NO              (NULL)                   
location                varchar(45)                   YES             (NULL)                   
overall_remarks         text                          YES             (NULL)                   
active                  tinyint(1)                    YES             1                        
is_complete             tinyint(1)                    YES             1                        
is_closed               tinyint(1)                    YES             (NULL)                   
is_data_migrated        tinyint(1)                    YES             0                        
report_close_date       datetime                      YES             (NULL)                   
report_completion_date  datetime                      YES             (NULL)                   
followup_number         int(11)                       YES             (NULL)                   
total_followups         int(11) unsigned              YES             0                        
last_modified_date      datetime                      YES             (NULL)                   
autosave_time           datetime                      YES             (NULL)                   
create_date             datetime                      NO              (NULL)                   
updated_by              int(10) unsigned              NO              (NULL)                   
nearest_visit_date      date                          YES             (NULL)                   

Ответы [ 2 ]

0 голосов
/ 23 сентября 2019

Во-первых, ваш запрос неверен по нескольким причинам:

  • * * * * * * * * * * * * * * * * * * * * * * в подзапросе относится к столбцу, а не к таблице.
  • group by можетвернуть несколько строк.

Я думаю, что вы хотите:

select dv.*,
       (select count(*)
        from dealer_visit dv2
        where dv2.dvr_id = dv.dealer_visit_id
       ) as totalDVRs
from dealer_visit dv;

Для производительности вы хотите индекс на dealer_visit(delaer_visit_id).

Предполагая, dealer_visit_id являетсяуникальный, тогда в MySQL 8+ вместо этого вы должны сделать:

select dv.*,
       count(dv.dvr_id) over (partition by dv.dvr_id) as totalDVRs
from dealer_visit dv;
0 голосов
/ 23 сентября 2019

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

Я думаю, что все сводится к правильной индексации ваших столбцов.

используйте EXPLAIN для изучения использования индекса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...