반응형
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
반응형
'MySql' 카테고리의 다른 글
MySQL InnoDB로 테이블을 MyISAM으로 변환하는 가장 안전한 방법은 무엇입니까? (0) | 2020.09.25 |
---|---|
MySQL 열에서 고유 한 값 선택 (0) | 2020.09.25 |
MySQL mysql에서 n 번째 행을 어떻게 선택합니까? (0) | 2020.09.25 |
MySQL "where"절의 mysql 하위 쿼리 결과 (0) | 2020.09.25 |
MySQL Calculate distance given 2 points, latitude and longitude (0) | 2020.09.25 |
댓글