MariaDB: 서브쿼리가 실패한 group_concat
MySQL 5.6.34(새 개발 서버)와 MariaDB 10.2.8(새 운영 서버, 오늘 드디어 코드를 도입할 줄 알았던 곳)에서 동일한 데이터베이스 구조와 데이터를 사용하여 MySQL은 작동하고 MariaDB는 작동하지 않습니다.이것은 MySQL 5.0.95에서 수년간 정상적으로 동작하고 있는 코드입니다.문제를 나타내는 최소한의 예시로 쿼리를 단순화했습니다.GROUP_CONCAT()
서브쿼리는 혼재하지 않습니다.다음은 쿼리입니다.
SELECT person.PersonID,
GROUP_CONCAT(CategoryID ORDER BY CategoryID SEPARATOR ',') AS categories
FROM person LEFT JOIN percat ON person.PersonID=percat.PersonID
WHERE person.PersonID IN (SELECT PersonID FROM action WHERE ActionTypeID=3)
GROUP BY person.PersonID
다음은 관련된 세 테이블의 구조를 보여주는 스크린샷의 합성 이미지입니다.
MySQL에서는 몇 년 전부터 정상적으로 동작하고 있습니다.결과는 다음과 같습니다.EXPLAIN
:
그리고 이게 내가 마리아에게 얻은 미친 결과야DB:
DB 엔진의 내부 작동 방식을 잘 모르기 때문에 따라갈 수 없습니다.EXPLAIN
하지만 단서는 저 안에 있을 거예요이 버그 리포트는 관련이 있는 것 같습니다만, 그들이 뭐라고 하는지, 그리고 더 중요한 것은 어떻게 해야 하는지 잘 모르겠습니다.
이것은 버그입니다.당신이 발견한 버그와는 전혀 다른 것 같습니다(이것은, 전술한 버그 리포트의 테스트 케이스가 10.2.8에서는 정상적으로 동작하고 있기 때문에, 당신의 버그는 실제로 동작하지 않습니다).MariaDB JIRA에 새로운 것을 신고해 주세요.
그 동안, 당신이 이 문제를 해결할 수 있을 거라고 생각합니다.
optimizer_switch=orderby_uses_equalities=off
cnf 파일에 저장해 주세요.이것은 새롭게 활성화된 최적화입니다.결점이 없는 것은 아닙니다.
업데이트: 이 버그는 https://jira.mariadb.org/browse/MDEV-13694로 보고되었습니다.
회피책 차이가 있는 이유에 대해서는 설명하지 않지만 다음 사항을 추가해야 합니다.DISTINCT
에게GROUP_CONCAT
.
"왜"라는 대답은 아마도 옵티마이저에 깊이 뿌리박고 있을 것입니다.5.0. 5.6에 많은 새로운 코드가 추가된 이후 많은 변화가 있었습니다.동시에 MariaDB는 10.0으로 분할되었습니다.이 포킹에서는 Optimizer가 크게 분산되어 있습니다.10.2는 더 나아갔지만, 반드시 이런 유형의 쿼리를 최적화하는 것은 아닙니다.
향상된 쿼리 쿼리에 대해 수행할 수 있는 몇 가지 작업이 있습니다.일부 기업은 이를 보다 빠르게 할 수 있습니다.
SELECT p.PersonID,
( SELECT GROUP_CONCAT(pc.CategoryID
ORDER BY CategoryID SEPARATOR ',')
FROM percat
WHERE PersonID = p.PersonID
) AS categories
FROM person
JOIN action AS a ON p.PersonID = a.PersonID
WHERE ActionTypeID = 3
GROUP BY p.PersonID
의 변혁신을LEFT JOIN
로드를 줄일 수 있을 것 같습니다.GROUP BY
... ★★★★★★★★★★★★★★.GROUP BY
제거할 수 있습니다.
에 에.PRIMARY KEY(PersonID, CategoryID)
, 는 필요 .DISTINCT
.
필요한 인덱스 이 "커버링 인덱스"는 작업 속도를 높일 수 있습니다.INDEX(ActionTypeID, PersonID)
.
언급URL : https://stackoverflow.com/questions/45922504/mariadb-group-concat-with-subquery-failing
'programing' 카테고리의 다른 글
Node.js에서 'use strict' 문은 어떻게 해석됩니까? (0) | 2023.01.24 |
---|---|
'this'가 있는 함수의 함수에 액세스하는 방법 (0) | 2023.01.24 |
생년월일을 기준으로 나이를 계산하다 (0) | 2023.01.24 |
MySQL InnoDB가 테이블에서 데이터 행을 삭제한 후 디스크 공간을 해제하지 않음 (0) | 2023.01.24 |
if-statement 내부에 변수 값 할당 (0) | 2023.01.24 |