반응형

PK가 없는 테이블에 관심을 가지는 이유

디폴트 엔진인 innodb의 테이블은 오라클의 클러스터링 테이블와 유사한 구조를 지닌다.

기본적으로 사용자가 생성하지 않더라도 auto_increment 속성의 hidden PK가 생성된다.

이럴꺼면 명시적으로 생성해서 추후 활용하는 것이 나은 것 같다.

특히 PK가 없는 테이블에서 대량의 변경작업이 발생할 경우 secondary장비에서 복제지연이 발생하는 경우를 간헐적으로 경험할 수 있었기에 주기적으로 모니터링하여 생성을 유도하고 있다.

PK없는 테이블 찾기

SELECT a.table_schema,
       a.table_name
FROM information_schema.tables a
         LEFT JOIN (SELECT table_schema,
                           table_name
                    FROM information_schema.table_constraints
                    WHERE constraint_type = 'PRIMARY KEY') b ON (
            a.table_schema = b.table_schema
        AND a.table_name = b.table_name
    )
WHERE a.table_schema NOT IN (
                             'information_schema',
                             'db_helper',
                             'mysql',
                             'performance_schema',
                             'sys'
    )
  AND b.table_name IS NULL
  AND a.table_type = 'BASE TABLE'
ORDER BY table_schema,
         table_name;

결과셋

+--------------+------------+
| table_schema | table_name |
+--------------+------------+
| howknow      | meter_aggr |
| howknow      | meter_raw  |
+--------------+------------+

PRIMARY KEY 찾기

SELECT table_schema,
       table_name
FROM information_schema.table_constraints
WHERE constraint_schema NOT IN (
                                'information_schema',
                                'db_helper',
                                'mysql',
                                'performance_schema',
                                'sys'
    )
  AND constraint_type IN ('PRIMARY KEY');

FOREIGN KEY 찾기

SELECT table_schema,
       table_name
FROM information_schema.table_constraints
WHERE constraint_schema NOT IN (
                                'information_schema',
                                'db_helper',
                                'mysql',
                                'performance_schema',
                                'sys'
    )
  AND constraint_type IN ('FOREIGN KEY');
반응형