MYSQL 데이터베이스의 기본 키로 사용되는 문자열
저는 데이터베이스와 데이터베이스가 어떻게 작동하는지에 대한 이론에 대해 잘 알지 못합니다.기본 키에 대해 정수보다 문자열을 사용하는 것이 성능 측면(삽입/업데이트/쿼리)에서 더 느립니까?
를 들어, 는 " , 1음의개행을가진있습다니가데스이이베터▁that▁like▁row다▁database▁for습▁million있▁100"와 같은 약 1억 개의 데이터베이스를 가지고 있습니다.mobile number, name and email
휴대폰 번호와 이메일은 고유할 것입니다.휴대폰 번호나 이메일을 기본 키로 받을 수 있을까요?
이메일이나 휴대폰 번호를 기반으로 검색할 때 쿼리 성능에 영향을 줍니다.마찬가지로 기본 키는 5-6개 테이블 또는 그 이상의 테이블에서 외부 키로 사용됩니다.
MySQL 데이터베이스를 사용하는 중입니다.
기술적으로는 그렇습니다. 하지만 문자열이 기본 키가 되는 것이 타당하다면 아마도 사용해야 할 것입니다.이 모든 것은 테이블 크기와 기본 키가 될 문자열의 길이에 따라 달라집니다(문자열 == 비교하기 더 어렵습니다).수백만 개의 행이 있는 테이블에는 반드시 문자열을 사용하지는 않겠지만, 작은 테이블에 문자열을 사용하면 성능이 느려지는 정도는 데이터와 관련하여 의미가 없는 정수를 사용하면 발생할 수 있는 문제에 비해 매우 적습니다.
Strings를 기본 키로 사용할 때의 또 다른 문제는 인덱스가 계속해서 순차적으로 정렬되기 때문에 새 키가 생성될 때 인덱스의 순서를 다시 지정해야 한다는 것입니다.자동 숫자 정수를 사용하면 새 키가 인덱스 끝에 추가됩니다.
순서 중간에 삽입이 발생하는 클러스터된 인덱스가 있는 테이블에 삽입해도 인덱스가 다시 작성되지 않습니다.데이터를 구성하는 페이지는 다시 작성되지 않습니다.페이지에 행이 이동할 공간이 있으면 해당 페이지에 배치됩니다.단일 페이지가 페이지의 올바른 위치에 행을 배치하도록 다시 포맷됩니다.페이지가 가득 차면 페이지 분할이 발생하여 페이지 행의 절반이 한 페이지로 이동하고 절반이 다른 페이지로 이동합니다.그런 다음 페이지는 클러스터된 인덱스가 있는 테이블 데이터로 구성된 페이지의 연결된 목록에 다시 연결됩니다.최대 2페이지의 데이터베이스를 작성하게 될 것입니다.
줄은 결합에서 더 느리고 실제로는 거의 유일하지 않습니다.유일한 장점은 이름만 얻기 위해 기본 테이블에 가입하는 경우 조인 수를 줄일 수 있다는 것입니다.그러나 문자열도 변경될 수 있기 때문에 회사 이름이 바뀌거나 결혼할 때 관련 기록을 모두 수정해야 하는 문제가 발생합니다.이는 성능에 큰 영향을 미칠 수 있으며, 관련되어야 하는 모든 테이블이 관련되지 않은 경우(생각보다 자주 발생) 데이터 불일치도 발생할 수 있습니다.레코드의 수명 동안 절대 변하지 않는 정수는 성능 측면뿐만 아니라 데이터 무결성 측면에서도 훨씬 안전한 선택입니다.일반적으로 자연 키는 데이터 유지 관리에 그다지 적합하지 않습니다.
또한 자동 증분 키(또는 일부 특수한 경우에는 GUID)를 PK로 사용한 다음 고유한 인덱스를 자연 키에 두는 것이 두 가지 모두에서 가장 좋은 방법입니다.가입이 빨라지고, 기록이 중복되지 않으며, 회사 이름이 바뀌었기 때문에 백만 개의 하위 기록을 업데이트할 필요가 없습니다.
기본 키가 고유한 경우 기본 키로 무엇을 사용하는지는 중요하지 않습니다.데이터를 복제할 계획이 없는 한 속도나 우수한 데이터베이스 설계에 관심이 있는 경우 int를 사용하고 GUID를 사용합니다.
만약 이것이 액세스 데이터베이스나 작은 앱이라면 누가 정말 신경을 쓰겠습니까.제 생각에 우리 대부분의 개발자들이 오래된 인토르 가이드를 전면에 내세우는 이유는 프로젝트가 우리에게 성장하는 방법이 있기 때문이고, 당신은 스스로 성장할 수 있는 선택권을 남겨두기를 원하기 때문입니다.
변수가 너무 많습니다.테이블 크기, 인덱스, 문자열 키 도메인의 특성에 따라 다릅니다.
일반적으로 정수가 더 빠릅니다.하지만 그 차이가 신경 쓸 만큼 클까요?말하기 어려워요.
또한 현을 선택하게 된 동기는 무엇입니까?숫자 자동 증분 키도 훨씬 더 쉬운 경우가 많습니다.의미론인가요?편리함?복제/연결 끊김 문제?여기서 답변하면 옵션이 제한될 수 있습니다.이를 통해 잊고 있는 세 번째 "하이브리드" 옵션을 떠올릴 수 있습니다.안내서.
데이터가 설명하는 주제와 일치하고 데이터의 의도된 용도에 잘 맞는 단순하고 건전한 설계를 얻을 때까지는 성능에 대해 걱정하지 마십시오.그런 다음 성능 문제가 발생하면 시스템을 조정하여 대처할 수 있습니다.
이 경우 신뢰할 수 있는 경우에는 문자열을 기본 키로 사용하는 것이 좋습니다.문자열이라고 해도 걱정하지 말고 문자열이 적당히 짧으면 최대 25자 정도입니다.성능 면에서 큰 대가를 치르지는 않을 것입니다.
데이터 입력자 또는 자동 데이터 소스는 항상 자연 키로 추정되는 값을 제공합니까, 아니면 생략되는 경우가 있습니까?입력 데이터에 가끔 오류가 있습니까?그렇다면 오류를 감지하고 수정하는 방법은 무엇입니까?
쿼리를 지정하는 프로그래머와 대화형 사용자는 원하는 것을 얻기 위해 자연 키를 사용할 수 있습니까?
자연키를 신뢰할 수 없다면 대리인을 발명하세요.대리인을 만들 경우에는 정수를 만들 수 있습니다.그렇다면 대리인을 사용자 커뮤니티에 숨겨야 할지 고민해야 합니다.대리키를 숨기지 않은 일부 개발자들은 후회하게 되었습니다.
지수는 많은 비교를 의미합니다.
일반적으로 문자열은 정수보다 길며 비교를 위해 정렬 규칙이 적용될 수 있으므로 문자열을 비교하는 것이 일반적으로 정수를 비교하는 것보다 계산 집약적인 작업입니다.
그러나 때때로 문자열을 기본 키로 사용하는 것이 추가 조인을 만드는 것보다 빠릅니다.string to numerical id
PK 열에 정수를 사용해야 하는 두 가지 이유:
자동으로 증가하는 정수 필드에 대한 ID를 설정할 수 있습니다.
PK를 생성할 때 DB는 테이블에 저장되기 전에 데이터를 정렬하는 인덱스(클러스터 또는 비클러스터)를 생성합니다.최적화 도구는 PK에서 ID를 사용하여 레코드를 저장하기 전에 정렬 순서를 확인할 필요가 없습니다.이렇게 하면 큰 테이블의 성능이 향상됩니다.
예, 하지만 수백만 개의 행이 있을 것으로 예상되지 않는 한 문자열 기반 키를 사용하지 않는 것이 보통 "초기 최적화"입니다.결국 문자열은 큰 숫자로 저장되고 숫자 키는 보통 작은 숫자로 저장됩니다.
그러나 주의해야 할 점은 키에 클러스터된 인덱스가 있고 인덱스에서 순차적이지 않은 많은 삽입을 수행하는 경우입니다.모든 행이 작성되면 인덱스가 다시 작성됩니다.배치 삽입을 수행하는 경우 프로세스 속도가 느려질 수 있습니다.
문자열을 기본 키로 사용하는 이유는 무엇입니까?
기본 키를 자동 증분 정수 필드로 설정하고 문자열 필드에 인덱스를 놓습니다.
이렇게 하면 테이블에서 검색을 수행하는 경우 상대적으로 빠른 속도여야 하며 모든 조인 및 일반 룩업은 속도에 영향을 받지 않습니다.
인덱스되는 문자열 필드의 양을 제어할 수도 있습니다.다시 말해, "처음 5자만 색인화"하면 충분하다고 생각하면 됩니다.또는 데이터가 상대적으로 유사할 수 있는 경우 전체 필드를 인덱싱할 수 있습니다.
성능 관점에서 - 예 문자열(PK)은 정수(PK)를 사용하여 달성한 성능과 비교할 때 성능이 느려집니다. 여기서 PK ---> 기본 키.
요구 사항의 관점에서 - 비록 이것이 당신의 질문의 일부는 아니지만, 저는 여전히 언급하고 싶습니다.서로 다른 테이블에서 대용량 데이터를 처리할 때 일반적으로 특정 테이블에 대해 설정할 수 있는 가능한 키 집합을 찾습니다.이는 주로 테이블이 많고 각 테이블 또는 일부 테이블이 어떤 관계(Foreign Key 개념)를 통해 서로 관련되어 있기 때문입니다.따라서 정수를 항상 기본 키로 선택할 수는 없습니다. 대신 해당 테이블의 기본 키로 3, 4 또는 5개의 속성 조합을 선택합니다.그리고 이 키들은 우리가 기록을 다른 테이블과 연관시킬 때 외국 키로 사용될 수 있습니다.이를 통해 필요한 경우 서로 다른 테이블 간에 레코드를 연결하는 것이 유용합니다.
따라서 최적의 사용을 위해 - 항상 1 또는 2개의 정수와 1 또는 2개의 문자열 속성의 조합을 만들지만 필요한 경우에만 다시 만듭니다.
기본 키로 정수를 사용한 다음 문자열(ID의 일종이라고 가정함)을 별도의 열로 사용할 수 있습니다.
create table sample (
sample_pk INT NOT NULL AUTO_INCREMENT,
sample_id VARCHAR(100) NOT NULL,
...
PRIMARY KEY(sample_pk)
);
항상 문자열(ID) 열(sample_id = ...)에서 조건부로 쿼리 및 조인을 수행할 수 있습니다.
데이터베이스의 문자열과 관련하여 매우 큰 오해가 있을 수 있습니다.거의 모든 사람이 숫자의 데이터베이스 표현이 문자열보다 더 압축적이라고 생각했습니다.그들은 db-s의 숫자가 메모리에 있는 것처럼 표현된다고 생각합니다.하지만 꼭 어렵지만은 않아요.대부분의 경우 숫자 표현은 다른 표현과 마찬가지로 A 문자열에 더 가깝습니다.
숫자 또는 문자열을 사용하는 속도는 유형 자체보다 인덱싱에 더 의존합니다.
기본적으로 ASPNetUserId는 128자 문자열이며 성능은 양호합니다.
표에서 키가 고유해야 하는 경우 키가 됩니다.이유는 여기에 있습니다.
기본 문자열 키 = 올바른 DB 관계, 1개의 문자열 키(기본) 및 1개의 문자열 인덱스(기본).
다른 옵션은 일반적인 int Key이지만 문자열이 고유해야 하는 경우에도 고유 여부를 확인하거나 확인하기 위해 중단 없는 쿼리 때문에 인덱스를 추가해야 할 수 있습니다.
따라서 ID 키 사용 = 잘못된 DB 관계, 1 int 키(기본), 1 int 인덱스(기본), 1 int 인덱스, 아마도 고유 문자열 인덱스가 존재하지 않으며 동일한 문자열을 수동으로 검증해야 합니다(sql 검사와 같은 것).
기본 키에 intover 문자열을 사용하여 성능을 향상시키려면 문자열이 고유해야 할 경우 매우 이상한 상황이 되어야 합니다.저는 항상 문자열 키를 사용하는 것을 선호해 왔습니다.그리고 경험적으로 볼 때, 필요할 때까지 데이터베이스를 정규화하는 것이 좋습니다.
언급URL : https://stackoverflow.com/questions/517579/strings-as-primary-keys-in-mysql-database
'programing' 카테고리의 다른 글
왼쪽/오른쪽 조인이 예상대로 null을 반환하지 않음 (0) | 2023.08.27 |
---|---|
작업을 실행할 때 AWS ECS 오류:클러스터에서 컨테이너 인스턴스를 찾을 수 없습니다. (0) | 2023.08.27 |
Python: 고유한 파일 이름을 만드는 방법은 무엇입니까? (0) | 2023.08.22 |
줄을 어떻게 매야 합니까?에서 사용자 지정 형식으로 TimeSpan 개체를 포맷합니다.NET? (0) | 2023.08.22 |
"cannot run in wd"로 인해 Npm 설치 실패 (0) | 2023.08.22 |