Команды SQL зависают при запросе при использовании с CONCAT

#mysql #sql #select #concatenation

#mysql #sql #выберите #конкатенация

Вопрос:

У меня есть следующие команды, которые я запускаю в MySQL в базе данных Jira:

 SELECT LOCAL_ISSUE_KEY , REMOTE_ISSUE_KEY 
FROM AO_A912D8_SYNC_INFORMATION 
WHERE substr(LOCAL_ISSUE_KEY, 5) 
IN 
  (SELECT issuenum 
  FROM jiraissue 
  WHERE issuetype 
  IN
    (SELECT ID
    FROM issuetype
    WHERE pname = "Story"
    )
  )
;
  

Это работает как шарм, однако я не удовлетворен, поскольку длина значения в LOCAL_ISSUE_KEY является переменной: EFW-12345 или FWAI-5432. Поэтому мне пришлось бы изменить на substr(LOCAL_ISSUE_KEY, 5) или substr(LOCAL_ISSUE_KEY, 6)

Итак, я хотел сделать что-то другое и WHERE IN проверить правильность строки благодаря CONCAT() вместо вычитания ее части.

В качестве черновика я сначала попробовал с этим:

 SELECT LOCAL_ISSUE_KEY , REMOTE_ISSUE_KEY 
FROM AO_A912D8_SYNC_INFORMATION 
WHERE LOCAL_ISSUE_KEY
IN 
  (SELECT CONCAT('EFW-',issuenum) 
  FROM jiraissue 
  WHERE issuetype 
  IN
    (SELECT ID
    FROM issuetype
    WHERE pname = "Story"
    )
  )
;
  

Но это не работает, запрос продолжается вечно

Обратите внимание, что он мог бы выполнить запрос с помощью чего-то подобного:

 SELECT LOCAL_ISSUE_KEY , REMOTE_ISSUE_KEY 
FROM AO_A912D8_SYNC_INFORMATION 
WHERE LOCAL_ISSUE_KEY
IN 
  (CONCAT('EFW-','58276')) 
;
  

Я также пробовал использовать больше () вокруг SELECT CONCAT() , но это все равно заставляло базу данных искать как сумасшедшую. Загрузка процессора достигает 100%.

Для информации, запрос на втором SELECT работает:

 SELECT CONCAT('EFW-',issuenum) FROM jiraissue WHERE issuetype IN (SELECT ID FROM issuetype WHERE pname = "Story" );
10610 rows in set (0.06 sec)
  

Вот как образец данных:

 issuetype
ID      pname
10000   Epic
10001   Story

jiraissue
ID      issuenum    PROJECT issuetype 
154705  1942        12000   10001

project
ID      pname       pkey
12000   myproject   EFW

AO_A912D8_SYNC_INFORMATION
LOCAL_ISSUE_KEY REMOTE_ISSUE_KEY
EFW-1942        ABC-12354
  

Комментарии:

1. что означает «поскольку длина является переменной».

2. Вопросы производительности должны включать EXPLAIN и некоторую информацию о размере таблицы, индексе, производительности в текущее время, времени ожидания и т.д. Slow это относительный термин, и нам нужно реальное значение для сравнения.

3. Примеры данных и желаемые результаты действительно помогли бы ВАМ

Ответ №1:

Вы можете попробовать использовать: SUBSTRING_INDEX(str, delim, count)

В вашем случае: SUBSTRING_INDEX(LOCAL_ISSUE_KEY, "-", 1)

Не используйте CONCAT , потому что это слишком тяжело, так как вам нужно изменить весь результат в подзапросе.

или даже лучше: RIGHT(str, len) -> вместо len используйте SUBSTRING_INDEX

Комментарии:

1. Где я могу это использовать, в моем примере? Это похоже на то, что у меня уже есть substr()

2. Вы можете использовать это в substr(LOCAL_ISSUE_KEY, SUBSTRING_INDEX(LOCAL_ISSUE_KEY, «-«, 1)), поэтому вместо использования константы 5

3. Не совсем то, что я хочу. Это позволяет получить вторую часть строки ABC-12345 благодаря SUBSTRING_INDEX(LOCAL_ISSUE_KEY, "-", -1) (с минусом, чтобы получить другую сторону). Но я бы получил некоторые вещи, которые мне не нужны. Например, если у меня есть ABC-123 и DEF-123 , это будет в два раза больше, чем 123. Все еще спасибо за ввод. Я пробовал с RIGHT SUBSTRING_INDEX , но это не работает

4. Пожалуйста. Вы упомянули только EFW-12345 или FWAI-5432. Если у вас есть ABC-123 и DEF-123, просто отметьте в where условие, которое вы хотите исключить…

Ответ №2:

Я не знаю, насколько велики ваши таблицы, т. Е. Сколько jiraissues или проектов хранится. Но вы пробовали, работает ли это быстрее?

 SELECT LOCAL_ISSUE_KEY , REMOTE_ISSUE_KEY 
FROM AO_A912D8_SYNC_INFORMATION 
WHERE LOCAL_ISSUE_KEY
IN 
  (SELECT distinct CONCAT('EFW-',issuenum) 
  FROM jiraissue 
  WHERE issuetype 
  IN
    (SELECT distinct ID
    FROM issuetype
    WHERE pname = "Story"
    )
  )
;