본문 바로가기
MySql

MySQL 쿼리의 SELECT 내에서 SELECT 사용

by 베이스 공부 2020. 9. 25.
반응형

SELECT 내에서 SELECT 를 사용하여 쿼리 수를 줄이는 것이 일반적입니다. 그러나 내가 조사한 것처럼 이것은 느린 쿼리로 이어집니다 (분명히 mysql 성능에 해 롭습니다). 다음과 같은 간단한 쿼리가 있습니다.

SELECT something
 FROM posts
 WHERE id IN (
  SELECT tag_map.id
  FROM tag_map
  INNER JOIN tags
  ON tags.tag_id=tag_map.tag_id
  WHERE tag IN ('tag1', 'tag2', 'tag3', 'tag4', 'tag5', 'tag6')
  )

이로 인해 "쿼리 시간 3-4 초, 잠금 시간 약 0.000090 초, 약 200 개 행이 검사 됨"의 느린 쿼리가 발생합니다.

SELECT 쿼리를 분할하면 각 쿼리가 매우 빠릅니다. 그러나 이것은 높은 동시성에 좋지 않은 쿼리의 수를 증가시킵니다.

일반적인 상황입니까, 아니면 코딩에 문제가 있습니까?

 

해결 방법

 

MySQL에서 이와 같은 하위 쿼리를 수행하는 것은 "상관 된 쿼리"입니다. 이는 외부 SELECT 의 결과가 내부 SELECT 의 결과에 따라 다르다는 것을 의미합니다. 결과는 내부 쿼리가 행당 한 번 실행되므로 매우 느립니다.

이 쿼리를 리팩터링해야합니다. 두 번 조인하거나 두 개의 쿼리를 사용하는지 여부는 대부분 관련이 없습니다. 두 번 가입하면 다음을 얻을 수 있습니다.

SELECT something
FROM posts
INNER JOIN tag_map ON tag_map.id = posts.id
INNER JOIN tags ON tags.tag_id = tag_map.tag_id
WHERE tags.tag IN ('tag1', ...)


팁 : EXPLAIN SELECT 는 최적화 프로그램이 쿼리 처리를 어떻게 계획하는지 보여줍니다. DEPENDENT SUBQUERY 가 표시되면 리팩토링해야합니다. 이는 매우 느립니다.

 

참조 페이지 https://stackoverflow.com/questions/8585592

 

 

반응형

댓글