이 자습서에서는 MySQL 데이터베이스에서 중복 행을 제거하여 데이터베이스 크기를 줄이고 서버 성능을 높이는 방법을 배웁니다.
계속하기 전에 다음을 가정합니다.
- 시스템에 MySQL이 설치되어 실행 중입니다.
- 데이터베이스에 대한 루트 액세스 권한이 있습니다.
- 실험 또는 테스트를 위해 데이터베이스에 액세스할 수 있습니다.
노트 : 이 가이드에 제공된 개념을 시도하기 위해 샘플 데이터베이스가 필요한 경우 Sakila 데이터베이스를 고려하거나 이 가이드에 사용된 데이터베이스 복사본을 다운로드하십시오.
리소스는 다음과 같습니다.
기본 사용법
시작하기 전에 테스트 목적으로 중복 값이 포함된 테이블을 의도적으로 만듭니다. 이 작업을 수행하기 위한 SQL 쿼리는 다음과 같습니다.
사용하다 세계;떨어지다 테이블 만약 존재 사용자;
창조하다 테이블 사용자(ID 지능 기본 키 아니다 없는 자동 증가 ,사용자 이름 바르차르 (10) 아니다 없는 ,성명 바르차르 (스물),이메일 바르차르 (255) 아니다 없는 );
끼워 넣다 안으로 사용자(사용자 이름,성명,이메일) 가치
('처녀 자리', '클로드 M. 모리', ' [이메일 보호됨] '),
('누르다', '티파니 G. 베일리', ' [이메일 보호됨] '),
('로켓', '크리스토퍼 S. 페이튼', ' [이메일 보호됨] '),
('암흑물질', '패트리샤 J. 폭스', ' [이메일 보호됨] '),
('주제', '페이 H. 하틀리', ' [이메일 보호됨] '),
('암흑물질', '패트리샤 J. 폭스', ' [이메일 보호됨] '),
('로켓', '크리스토퍼 S. 페이튼', ' [이메일 보호됨] '),
('아르테미스', '웨슬리 C. 딜라드', ' [이메일 보호됨] ');
필요에 맞게 위의 쿼리를 자유롭게 수정하십시오. 또한 오류를 피하기 위해 생성된 데이터베이스(world)가 있는지 확인해야 합니다.
이제 테이블 내부의 모든 데이터를 사용자 이름순으로 가져오면 다음과 같이 중복 항목이 표시됩니다.
mysql> 사용하다 세계;데이터 베이스 변경
mysql> 선택하다 * 에서 사용자 주문 사용자 이름;
+ ---- + ------------ + ----------------------- + ------- ---------------- +
|ID|사용자 이름|성명|이메일|
+ ---- + ------------ + ----------------------- + ------- ---------------- +
| 8 |아르테미스|웨슬리 C. 딜라드|[이메일 보호됨]|
| 4 |암흑물질|패트리샤 제이 폭스|[이메일 보호됨]|
| 6 |암흑물질|패트리샤 제이 폭스|[이메일 보호됨]|
| 2 |누르다|티파니 G. 베일리|[이메일 보호됨]|
| 5 |주제|페이 H. 하틀리|[이메일 보호됨]|
| 삼 |로켓|크리스토퍼 S. 페이튼|[이메일 보호됨]|
| 7 |로켓|크리스토퍼 S. 페이튼|[이메일 보호됨]|
| 1 |처녀 자리|클로드 M. 모리|[이메일 보호됨]|
+ ---- + ------------ + ----------------------- + ------- ---------------- +
위의 표에서 알 수 있듯이 데이터베이스를 이유 없이 더 크게 만들고 속도를 느리게 만드는 두 개의 중복 값이 있습니다.
이제 이러한 값을 제거하는 방법을 알아보겠습니다.
#1 – 가입 삭제
데이터베이스에서 중복 행을 제거하는 한 가지 방법은 MySQL DELETE JOIN 문을 사용하는 것입니다. 그러나 쿼리는 ID를 사용하여 중복 값을 제거합니다.
예를 들어 위의 users 테이블에서 중복 값을 제거하기 위해 다음을 입력할 수 있습니다.
삭제 1 번 테이블 에서 사용자 테이블1 안의 가입하다 사용자 table2 어디 table1.id<table2.id 그리고 table1.이메일=table2.이메일;위의 쿼리를 실행하면 아래 출력과 같이 중복 값이 제거됩니다.
mysql> 삭제 1 번 테이블 에서 사용자 테이블1 안의 가입하다 사용자 table2 어디 table1.id<table2.id 그리고 table1.이메일=table2.이메일;쿼리 확인, 2영향을 받는 행(0.01비서)
mysql> 선택하다 * 에서 사용자 주문 사용자 이름;
+ ---- + ------------ + ----------------------- + ------- ---------------- +
|ID|사용자 이름|성명|이메일|
+ ---- + ------------ + ----------------------- + ------- ---------------- +
| 8 |아르테미스|웨슬리 C. 딜라드|[이메일 보호됨]|
| 6 |암흑물질|패트리샤 제이 폭스|[이메일 보호됨]|
| 2 |누르다|티파니 G. 베일리|[이메일 보호됨]|
| 5 |주제|페이 H. 하틀리|[이메일 보호됨]|
| 7 |로켓|크리스토퍼 S. 페이튼|[이메일 보호됨]|
| 1 |처녀 자리|클로드 M. 모리|[이메일 보호됨]|
+ ---- + ------------ + ----------------------- + ------- ---------------- +
#2 – Row_Number() 함수
우리가 구현할 수 있는 두 번째 방법은 MySQL row_number() 함수를 사용하는 것입니다. 이 기능은 MySQL 버전 8 이상에서 지원됩니다.
각 행에 순차적 int 값을 할당하여 작동하며 중복 값이 포함된 행은 1보다 큰 값을 얻습니다.
이 기능에 대해 자세히 알아보려면 아래 제공된 리소스를 사용하십시오.
https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html#function_row-number
중복 값이 있는 행의 ID를 반환하는 아래 쿼리를 고려하십시오.
선택하다 ID 에서 ( 선택하다 ID,ROW_NUMBER()위에( 분할 사용자 이름으로 주문 사용자 이름) 같이 row_var 에서 사용자)t1 어디 row_var> 1;위의 쿼리를 실행하면 아래 출력과 같이 ID 목록을 가져와야 합니다.
+ ---- +|ID|
+ ---- +
| 6 |
| 7 |
+ ---- +
2행 ~에 세트 (0.01비서)
값을 제거하려면 아래와 같이 SELECT 문을 DELETE 문으로 바꾸면 됩니다.
삭제 에서 사용자 어디 ID 에 ( 선택하다 ID 에서 ( 선택하다 ID,ROW_NUMBER()위에( 분할 사용자 이름으로 주문 사용자 이름) 같이 row_var 에서 사용자)t1 어디 row_var> 1);마지막으로 SELECT 문을 사용하여 중복 값이 제거되었는지 확인할 수 있습니다.
mysql> 선택하다 * ~에서 사용자 주문 사용자 이름;+ ---- + ------------ + ----------------------- + ------- ---------------- +
|ID|사용자 이름|성명|이메일|
+ ---- + ------------ + ----------------------- + ------- ---------------- +
| 8 |아르테미스|웨슬리 C. 딜라드|[이메일 보호됨]|
| 4 |암흑물질|패트리샤 제이 폭스|[이메일 보호됨]|
| 2 |누르다|티파니 G. 베일리|[이메일 보호됨]|
| 5 |주제|페이 H. 하틀리|[이메일 보호됨]|
| 삼 |로켓|크리스토퍼 S. 페이튼|[이메일 보호됨]|
| 1 |처녀 자리|클로드 M. 모리|[이메일 보호됨]|
+ ---- + ------------ + ----------------------- + ------- ---------------- +
결론
이 자습서에서는 데이터베이스에서 중복 값을 제거하는 두 가지 방법에 대해 설명했습니다. 대규모 데이터베이스, 특히 일반적으로 사용되는 데이터베이스에는 외부 가져오기 및 기타 오류에서 많은 중복 값이 포함될 수 있습니다. 따라서 응용 프로그램이 최적의 성능을 발휘할 수 있도록 중복 값을 계속 제거해야 합니다.