Медленный SQL IN Query - PullRequest
       3

Медленный SQL IN Query

0 голосов
/ 04 июля 2018

У меня следующий запрос. Мне нужна информация из таблицы, но нет ключей, связывающих эти две таблицы, и на самом деле не имеет смысла ссылаться на другую таблицу из любой таблицы.

Мой запрос:

SELECT COUNT(*) 
FROM courses as c 
WHERE c.StartYear = 2016 
AND  c.student_id IN (SELECT DISTINCT p.student_id 
                      FROM programs AS p 
                      WHERE p.StartYear = 2016 
                      AND p.program_code NOT LIKE "M%")

Этот запрос занимает около 5 секунд, что слишком долго. Есть ли лучший способ сделать это?

Сервер: MySQL Версия сервера: 5.6.35

Ответы [ 3 ]

0 голосов
/ 04 июля 2018

exists должен работать лучше, чем предложение In, так что вы можете попробовать этот запрос. Нажмите здесь для соответствующего обсуждения.

SELECT COUNT(*) 
FROM courses as c 
WHERE c.StartYear = 2016 
AND Exists (SELECT 1
            FROM programs AS p 
            WHERE p.StartYear = 2016 
            AND student_id = c.student_id
            AND p.program_code NOT LIKE "M%")
0 голосов
/ 04 июля 2018

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

Если приведенный ниже запрос является логически неправильным, как и ваш пример запроса, и вы должны привести фиктивный пример, чтобы продемонстрировать желаемую логику: https://stackoverflow.com/help/mcve

SELECT
  COUNT(*)
FROM
  courses    c
INNER JOIN
(
  SELECT
    student_id,
    startYear
  FROM
    programs
  WHERE
    program_code NOT LIKE "M%"
  GROUP BY
    student_id,
    startYear
)
  p
    ON  p.student_id = c.student_id
    AND p.startYear  = c.startYear
WHERE
  c.StartYear = 2016
0 голосов
/ 04 июля 2018

Попробуйте существует

SELECT COUNT(*) 
  FROM courses as c 
 WHERE c.StartYear = 2016 
   and exists (SELECT 1
                 FROM programs AS p 
                WHERE p.StartYear = 2016 
                  AND p.program_code NOT LIKE "M%" 
                  and c.student_id = p.student_id)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...