데이터베이스 스키마는 테이블, 열, 관계, 인덱스, 데이터 구성 및 액세스 방식을 형성하는 제약 조건 등 데이터베이스의 논리적 구조를 정의합니다. 데이터가 저장되는 방식뿐만 아니라 쿼리, 트랜잭션 및 기타 작업과 상호 작용하는 방식도 중요합니다.
이러한 점검은 눈덩이처럼 불어나 더 큰 문제가 발생하기 전에 새로운 문제나 남아 있는 문제를 파악하는 데 도움이 될 수 있습니다. 아래에서 이러한 스키마 검사에 대해 자세히 알아보고 데이터베이스가 통과하지 못할 경우 문제를 해결하는 방법을 정확하게 알아볼 수 있습니다. 스키마를 변경하기 전에 항상 데이터를 백업하여 수정 중에 발생할 수 있는 잠재적 위험으로부터 보호하세요.
기본 키는 모든 테이블의 중요한 부분으로, 각 행을 고유하게 식별하고 효율적인 쿼리를 가능하게 합니다. 기본 키가 없으면 테이블에 성능 문제가 발생할 수 있으며 복제 및 스키마 변경 유틸리티와 같은 특정 도구가 제대로 작동하지 않을 수 있습니다.
스키마를 설계할 때 기본 키를 정의하면 피할 수 있는 몇 가지 문제가 있습니다.
테이블이 이미 생성된 경우 "ID" 열에 PRIMARY KEY 제약 조건을 생성하려면 다음 SQL을 사용하세요.
ALTER TABLE Persons ADD PRIMARY KEY (ID);
여러 열에 기본 키를 정의하려면:
ALTER TABLE Persons ADD CONSTRAINT PK_Person PRIMARY KEY (ID, LastName);
참고: ALTER TABLE 명령을 사용하는 경우 테이블이 처음 생성될 때 기본 키 열이 NULL 값을 포함하지 않도록 선언되어야 합니다.
MyISAM 스토리지 엔진은 더 이상 사용되지 않으며 이를 계속 사용하는 테이블은 InnoDB로 마이그레이션해야 합니다. InnoDB는 뛰어난 성능, 데이터 복구 기능 및 트랜잭션 지원으로 인해 대부분의 사용 사례에 기본이자 권장되는 엔진입니다. MyISAM에서 InnoDB로 마이그레이션하면 쓰기 작업이 많은 애플리케이션의 성능이 크게 향상되고 내결함성이 향상되며 전체 텍스트 검색 및 외래 키와 같은 고급 MySQL 기능을 사용할 수 있습니다.
InnoDB를 선호하는 이유:
ALTER TABLE Persons ADD PRIMARY KEY (ID);
테이블 전체 또는 테이블 내에서 서로 다른 데이터 정렬을 사용하면 특히 문자열 비교 및 조인 중에 성능 문제가 발생할 수 있습니다. 두 문자열 열의 데이터 정렬이 다른 경우 MySQL은 런타임에 문자열을 변환해야 할 수 있으며, 이로 인해 인덱스가 사용되지 않고 쿼리 속도가 느려질 수 있습니다.
혼합 데이터 정렬 테이블을 변경하면 다음과 같은 몇 가지 문제가 나타날 수 있습니다.
데이터베이스의 데이터 정렬 설정을 변경하기 전에 비프로덕션 환경에서 접근 방식을 테스트하여 의도하지 않은 결과가 발생하지 않도록 하세요. 확실하지 않은 사항이 있으면 DBA에게 문의하는 것이 가장 좋습니다.
모든 데이터베이스에 대한 기본 문자 집합 및 데이터 정렬 검색:
ALTER TABLE Persons ADD CONSTRAINT PK_Person PRIMARY KEY (ID, LastName);
특정 테이블의 데이터 정렬 확인:
ALTER TABLE <table_name> ENGINE=InnoDB;
서버의 기본 문자 집합 찾기:
SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM INFORMATION_SCHEMA.SCHEMATA;
서버의 기본 데이터 정렬 찾기:
SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_COLLATION FROM information_schema.TABLES WHERE TABLE_COLLATION IS NOT NULL ORDER BY TABLE_SCHEMA, TABLE_COLLATION;
특정 데이터베이스의 데이터 정렬 업데이트:
SELECT @@GLOBAL.character_set_server;
특정 테이블의 데이터 정렬 업데이트:
SELECT @@GLOBAL.collation_server;
혼합 문자 집합은 성능 및 호환성 문제를 일으킬 수 있다는 점에서 혼합 데이터 정렬과 유사합니다. 혼합 문자 집합은 서로 다른 열이나 테이블이 데이터 저장에 서로 다른 인코딩 형식을 사용하는 경우 발생합니다.
데이터베이스의 문자 설정을 조정하기 전에 스테이징 환경에서 변경 사항을 테스트하여 예상치 못한 문제가 발생하지 않도록 하세요. 어떤 단계에 대해 확실하지 않은 경우 DBA에게 문의하여 지침을 받으세요.
모든 데이터베이스에 대한 기본 문자 집합 및 데이터 정렬 검색:
ALTER TABLE Persons ADD PRIMARY KEY (ID);
열의 문자 집합 가져오기:
ALTER TABLE Persons ADD CONSTRAINT PK_Person PRIMARY KEY (ID, LastName);
서버의 기본 문자 집합 찾기:
ALTER TABLE <table_name> ENGINE=InnoDB;
서버의 기본 데이터 정렬 찾기:
SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM INFORMATION_SCHEMA.SCHEMATA;
테이블 구조를 보려면:
SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_COLLATION FROM information_schema.TABLES WHERE TABLE_COLLATION IS NOT NULL ORDER BY TABLE_SCHEMA, TABLE_COLLATION;
예제 출력:
SELECT @@GLOBAL.character_set_server;
열 문자 집합을 변경하려면:
SELECT @@GLOBAL.collation_server;
무한히 커질 것으로 예상되고 기본 키에 자동 증가를 사용할 것으로 예상되는 테이블의 경우 UNSIGNED BIGINT 데이터 유형으로 전환하는 것이 좋습니다. 이를 통해 열은 훨씬 더 넓은 범위의 값을 처리할 수 있으므로 나중에 최대값에 도달한 후 비용이 많이 드는 테이블 변경이 필요하지 않습니다. UNSIGNED를 지정하면 양수 값만 저장되어 데이터 유형의 범위가 사실상 두 배로 늘어납니다.
열 유형을 UNSIGNED BIGINT로 수정하려면:
ALTER DATABASE <db-name> COLLATE=<collation-name>;
외래 키는 상위 테이블과 하위 테이블 간의 관계를 유지하여 데이터 일관성을 제공하지만 데이터베이스 성능에도 영향을 미칩니다. 쓰기 작업이 발생할 때마다 관련 데이터의 무결성을 확인하기 위해 추가 조회가 필요합니다. 특히 트래픽이 많은 환경에서는 속도가 느려질 수 있습니다.
성능이 중요하다면 특히 애플리케이션 수준에서 데이터 일관성을 처리할 수 있는 시나리오에서는 외래 키 제거를 고려할 수 있습니다.
테이블에서 외래 키 제약 조건을 삭제하려면:
ALTER TABLE Persons ADD PRIMARY KEY (ID);
MySQL의 중복 인덱스는 불필요한 디스크 공간을 소비하고 모든 인덱스를 업데이트해야 하므로 쓰기 작업 중에 추가 오버헤드를 생성합니다. 이는 쿼리 최적화를 복잡하게 만들어 잠재적으로 실질적인 이점을 제공하지 못한 채 비효율적인 실행 계획을 초래할 수 있습니다.
중복 인덱스를 식별하고 제거하여 쿼리 최적화를 간소화하고 오버헤드를 줄입니다. 하지만 인덱스를 제거하기 전에 해당 인덱스가 중요한 쿼리에 사용되고 있지 않은지 확인하세요.
MySQL에서 사용되지 않는 인덱스는 디스크 공간을 소비하고 삽입, 업데이트, 삭제 중 처리 오버헤드를 증가시키고 전체 작업 속도를 저하시켜 데이터베이스 성능에 부정적인 영향을 미칠 수 있습니다. 인덱스는 쿼리 속도를 높이는 데 유용하지만 사용되지 않는 인덱스는 시스템에 불필요한 부담을 줄 수 있습니다.
사용되지 않거나 중복된 색인을 제거하면 다음과 같은 추가 이점이 있습니다.
MySQL 또는 MariabDB에서 사용되지 않는 인덱스를 식별하려면 다음 SQL 문을 사용하십시오.
ALTER TABLE Persons ADD CONSTRAINT PK_Person PRIMARY KEY (ID, LastName);
MySQL 8.0 이상에서는 인덱스를 완전히 삭제하지 않고도 인덱스가 필요한지 테스트하기 위해 인덱스를 보이지 않게 만들 수 있습니다.
ALTER TABLE <table_name> ENGINE=InnoDB;
성능에 영향이 없으면 인덱스를 안전하게 삭제할 수 있습니다.
SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM INFORMATION_SCHEMA.SCHEMATA;
필요한 경우 색인을 다시 표시되도록 되돌릴 수 있습니다.
SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_COLLATION FROM information_schema.TABLES WHERE TABLE_COLLATION IS NOT NULL ORDER BY TABLE_SCHEMA, TABLE_COLLATION;
최신 업데이트를 통해 이제 Releem에는 포괄적인 스키마 상태 확인이 포함되었습니다. 이러한 검사는 감지된 문제를 해결하기 위한 실행 가능한 권장 사항과 함께 데이터베이스의 구조적 무결성에 대한 실시간 통찰력을 제공합니다.
Releem은 스키마 모니터링 프로세스를 자동화하여 수동 검사에서 추측을 배제하고 데이터베이스 엔지니어의 시간과 노력을 크게 절약합니다. 스키마 세부 사항에 시간을 낭비하는 대신 이제 더 긴급한 작업에 집중할 수 있습니다.
위 내용은 데이터베이스 성능 향상을 위한 주요 ySQL 스키마 검사의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!