programing

MySQL/MariaDB에서 명시적으로 쿼리되는 컬럼을 찾을 수 있습니까?

procenter 2022. 12. 9. 22:23
반응형

MySQL/MariaDB에서 명시적으로 쿼리되는 컬럼을 찾을 수 있습니까?

수백 개의 기둥이 있는 아주 크고 오래된 테이블이 있습니다.일부 열은 기록이며 쓰기 클라이언트에서 사용되지 않습니다.대부분 비어 있습니다(매우 오래된 레코드에서 예상됨).DB를 정리하고 특정 테이블에서 사용되지 않은 오래된 열을 제거합니다.

문제는 이 DB에 액세스하는 모든 서드파티 클라이언트입니다(읽기 전용).모든 프로바이더가 그들의 클라이언트를 업데이트 할 것이라고는 기대할 수 없습니다.문의가 있는 한SELECT * ...,그건 중요하지 않아.하지만 나는 그들이 명시적으로 질문하기를 기대한다.SELECT colA, colB, ...테이블에서 colA를 삭제하면 클라이언트 측에서 오류가 발생할 수 있습니다.

이제 사용하지 않는 열을 제거할 수 있도록 쿼리 문에서 명시적으로 사용하는 열을 알고 싶습니다.쿼리 로그를 사용하여 분석하고 명시적으로 사용된 열을 찾을 수 있지만,

  1. 우리는 시간당 몇 백만 건의 쿼리를 받습니다.
  2. 일부 클라이언트는 일주일에 한 번씩 또는 매초마다 당사의 DB에 액세스합니다.

즉, 쿼리 로그는 실제 가동 환경에서 몇 달 동안 실행되어야 하며, 이것이 서버 또는 전체 성능에 부정적인 영향을 미칠 수 있는지 알 수 없습니다.

좀 더 확실한 해결책은 없을까?조회 로그에 대한 제 우려가 과장된 건가요?MariaDB/MySQL이 통계데이터를 어딘가에 저장하여 컬럼의 사용현황을 알 수 있기를 기대했지만, 필요한 것을 찾을 수 없었습니다.

쿼리에 언급된 열에 대한 로그는 없습니다.

"일반 로그"는 모든 쿼리를 파일에 복사합니다.이는 특히 "시간당 수백만 건의 쿼리"를 사용하는 경우 심각한 Disk 문제(공간 및 속도)가 될 수 있습니다.하지만 답을 찾으려는 시도가 있을 거야

일반적인 로그는 다음을 통해 요약될 수 있습니다.pt-query-digest.

또 다른 방법은tcpdump와 함께pt-query-digest모든 쿼리를 잡을 수 있습니다.

다이제스트의 장점은 여러 개의 '유사한' 쿼리를 하나의 엔트리로 통합한다는 것입니다.그래도 수동으로(또는 문제가 있는 경우) 출력을 체로 걸러야 합니다.

대부분의 열은 사용하지 않더라도 제거할 가치가 없습니다.나는 가장 통통한 10%에 초점을 맞출 것을 제안합니다.사용할 수 있는 방법이 있을 것이다.tcpdump | egrep을 몇수 있는 가 발견될 가능성이 이를 여러 번 수정하면 제거할 수 있는 몇 가지 유력한 후보가 발견될 수 있습니다.

가 '아예'를 '아예'가 됩니다.SELECT *

KEY_COLUMN_USAGE 테이블에는 제약이 있는 키 열이 기술되어 있습니다.결과에 테이블 이름이 짝수입니다.빈 결과를 얻을 경우 FK에 대한 걱정 없이 테이블에서 필드를 삭제할 수 있습니다.

SELECT *
    FROM
      KEY_COLUMN_USAGE
    WHERE
       REFERENCED_COLUMN_NAME = 'your_column_name';

언급URL : https://stackoverflow.com/questions/44883862/is-it-possible-to-find-out-which-columns-are-not-explicitly-queried-in-mysql-m

반응형