programing

MariaDB: 서브쿼리가 실패한 group_concat

minecode 2023. 1. 24. 08:20
반응형

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:

MySQL 5.6.34

그리고 이게 내가 마리아에게 얻은 미친 결과야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

반응형