MySQL이 uuid를 기본 키로 사용할 수 없는 이유에 대해 이야기해 보겠습니다.
이 기사에서는 MySQL이 uuid를 기본 키로 사용할 수 없다는 관련 지식을 제공합니다. MySQL은 공식적으로 uuid 또는 불연속적이고 반복되지 않는 눈송이 ID를 사용하지 말 것을 권장하지만, 지속적인 자체 증가 기본 키 ID는 auto_increment입니다. uuid를 사용하는 것이 권장되지 않는 이유는 무엇입니까? 모든 사람에게 도움이 되기를 바랍니다.
머리말
mysql에서는 공식적으로 uuid 또는 불연속적이고 반복되지 않는 눈송이 ID(긴 모양의 고유한 단일 머신 증분)를 사용하지 말 것을 권장하지만 연속 자동을 권장합니다. -increment 기본 키 ID에 대한 공식 권장 사항은 auto_increment인데, uuid를 사용하는 것이 권장되지 않는 이유는 무엇입니까?
1. MySQL 및 프로그램 예제
1.1 이 문제를 설명하기 위해 먼저 세 개의 테이블을 만듭니다.
자동으로 증가하는 기본 키를 나타내는 user_auto_key, user_uuid, user_random_key이고 uuid는 기본 키 ,
기본 키로 무작위 키를 사용하고 나머지는 그대로 유지합니다.
제어 변수 방식에 따라 서로 다른 전략을 사용하여 각 테이블의 기본 키만 생성하고 다른 필드는 정확히 동일하고 테이블의 삽입 속도와 쿼리 속도를 테스트합니다.
참고: 여기서 임의 키는 실제로 눈송이 알고리즘으로 계산된 비연속, 비반복 및 불규칙 ID를 나타냅니다. 비트 긴 값
1.2. 이론만으로는 충분하지 않습니다. 프로그램으로 이동하여 Spring의 jdbcTemplate을 사용하여 추가 검사 테스트를 구현하세요.
기술 프레임워크: springboot+ jdbcTemplate+junit+hutool 프로그램의 원리는 자체 테스트 데이터베이스를 연결한 다음 동일한 환경에서 동일한 양의 데이터를 작성하고 삽입 시간을 분석하여 효율성을 종합적으로 분석하는 것입니다. 가장 현실적인 효과는 이름, 이메일 주소, 주소 등 모든 데이터가 무작위로 생성된다는 것입니다.
package com.wyq.mysqldemo; import cn.hutool.core.collection.CollectionUtil; import com.wyq.mysqldemo.databaseobject.UserKeyAuto; import com.wyq.mysqldemo.databaseobject.UserKeyRandom; import com.wyq.mysqldemo.databaseobject.UserKeyUUID; import com.wyq.mysqldemo.diffkeytest.AutoKeyTableService; import com.wyq.mysqldemo.diffkeytest.RandomKeyTableService; import com.wyq.mysqldemo.diffkeytest.UUIDKeyTableService; import com.wyq.mysqldemo.util.JdbcTemplateService; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.util.StopWatch; import java.util.List; @SpringBootTest class MysqlDemoApplicationTests { @Autowired private JdbcTemplateService jdbcTemplateService; @Autowired private AutoKeyTableService autoKeyTableService; @Autowired private UUIDKeyTableService uuidKeyTableService; @Autowired private RandomKeyTableService randomKeyTableService; @Test void testDBTime() { StopWatch stopwatch = new StopWatch("执行sql时间消耗"); /** * auto_increment key任务 */ final String insertSql = "INSERT INTO user_key_auto(user_id,user_name,sex,address,city,email,state) VALUES(?,?,?,?,?,?,?)"; List<UserKeyAuto> insertData = autoKeyTableService.getInsertData(); stopwatch.start("自动生成key表任务开始"); long start1 = System.currentTimeMillis(); if (CollectionUtil.isNotEmpty(insertData)) { boolean insertResult = jdbcTemplateService.insert(insertSql, insertData, false); System.out.println(insertResult); } long end1 = System.currentTimeMillis(); System.out.println("auto key消耗的时间:" + (end1 - start1)); stopwatch.stop(); /** * uudID的key */ final String insertSql2 = "INSERT INTO user_uuid(id,user_id,user_name,sex,address,city,email,state) VALUES(?,?,?,?,?,?,?,?)"; List<UserKeyUUID> insertData2 = uuidKeyTableService.getInsertData(); stopwatch.start("UUID的key表任务开始"); long begin = System.currentTimeMillis(); if (CollectionUtil.isNotEmpty(insertData)) { boolean insertResult = jdbcTemplateService.insert(insertSql2, insertData2, true); System.out.println(insertResult); } long over = System.currentTimeMillis(); System.out.println("UUID key消耗的时间:" + (over - begin)); stopwatch.stop(); /** * 随机的long值key */ final String insertSql3 = "INSERT INTO user_random_key(id,user_id,user_name,sex,address,city,email,state) VALUES(?,?,?,?,?,?,?,?)"; List<UserKeyRandom> insertData3 = randomKeyTableService.getInsertData(); stopwatch.start("随机的long值key表任务开始"); Long start = System.currentTimeMillis(); if (CollectionUtil.isNotEmpty(insertData)) { boolean insertResult = jdbcTemplateService.insert(insertSql3, insertData3, true); System.out.println(insertResult); } Long end = System.currentTimeMillis(); System.out.println("随机key任务消耗时间:" + (end - start)); stopwatch.stop(); String result = stopwatch.prettyPrint(); System.out.println(result); }
1.3. 프로그램 작성 결과
데이터 양이 100W 정도일 때 uuid의 삽입 효율이 가장 밑에 있고, 130W의 데이터가 추가되는 것을 알 수 있습니다. 포스트오더, 그리고 우디의 시간은 다시 급락했습니다.
시간 사용량에 따른 전체 효율성 순위는 auto_key>random_key>uuid이며, uuid는 효율성이 가장 낮습니다. 데이터 양이 많으면 효율성이 급락합니다. 그렇다면 왜 이런 일이 발생합니까? 의심스러운 부분이 있으면 이 문제에 대해 토론해 보겠습니다.
2. uuid와 self-increasing id를 사용한 인덱스 구조 비교
2.1 self-increasing id를 사용한 내부 구조
Auto- 증가 기본 키의 값은 순차적이므로 Innodb는 각 레코드를 레코드 뒤에 저장합니다. 페이지의 최대 채우기 비율에 도달하면(InnoDB의 기본 최대 채우기 비율은 페이지 크기의 15/16이며 향후 수정을 위해 공간의 1/16이 남습니다):
① 다음 레코드가 작성됩니다. 새로운 한 페이지에 이 순서대로 데이터가 로드되면 기본 키 페이지가 거의 순차적인 레코드로 채워져 페이지의 최대 채우기 비율이 높아지고 페이지 낭비가 발생하지 않습니다
② 새로 삽입된 행 확실히 원본에 있을 것입니다. 가장 큰 데이터 행의 다음 행, mysql 위치 지정 및 주소 지정이 매우 빠르며 새 행의 위치를 계산하는 데 추가 소비가 발생하지 않습니다
③페이지 분할 및 조각 생성을 줄입니다
2.2. uuid 내부 인덱스 구조 사용
uuid는 순차적 자동 증가 ID에 비해 불규칙하기 때문에 새 행의 값이 반드시 이전 기본 키의 값보다 클 필요는 없으므로 innodb가 항상 추가할 수는 없습니다. 새 행은 인덱스 끝에 삽입되지만 새 공간을 할당하려면 새 행에 적합한 새 위치를 찾아야 합니다.
이 과정에는 추가 작업이 많이 필요합니다. 무질서한 데이터로 인해 데이터가 분산되어 다음과 같은 문제가 발생합니다.
① 작성된 대상 페이지가 디스크에 플러시되고 캐시에서 제거되었을 가능성이 높습니다. , 또는 캐시에 로드되지 않은 경우 innodb는 삽입하기 전에 대상 페이지를 디스크에서 메모리로 찾아서 읽어야 합니다. 이로 인해 많은 무작위 IO가 발생합니다
② 쓰기 순서가 잘못되었기 때문에 innodb는 자주 페이지를 읽어야 합니다. 새 행에 공간을 할당하기 위해 분할 작업이 수행됩니다. 페이지 분할을 수행하면 한 번의 삽입을 위해 최소 3페이지를 수정해야 합니다.
③잦은 페이지 분할로 인해 페이지가 희박해지고 불규칙하게 채워져 결국 데이터 조각화가 발생하게 됩니다.
향후에는 클러스터형 인덱스(innodb 기본 인덱스)에 임의의 값(uuid 및 Snowflake id)을 로드합니다. , 때로는 OPTIMEIZE TABLE을 수행하여 테이블을 다시 작성하고 페이지 채우기를 최적화해야 하며, 이는 일정 시간이 걸립니다.
결론: innodb를 사용할 때는 기본 키의 자동 증가 순서로 최대한 많이 삽입해야 하며, 새로운 행을 삽입하려면 단조롭게 증가하는 클러스터 키 값을 사용해 보십시오
2.3. -증가하는 ID
그럼 자동증가되는 ID를 사용해도 문제가 없는 걸까요? 아니요, 자체 증가 ID에는 다음과 같은 문제도 있습니다.
① 다른 사람이 귀하의 데이터베이스를 크롤링하면 데이터베이스의 자체 증가 ID를 기반으로 귀하의 비즈니스 성장 정보를 얻을 수 있으며 귀하의 비즈니스 상황을 쉽게 분석할 수 있습니다
② 동시성 로드가 높은 경우 InnoDB는 기본 키로 삽입할 때 명백한 잠금 경합을 유발합니다. 모든 삽입이 여기에서 발생하고 동시 삽입으로 인해 갭 잠금이 발생하기 때문입니다.
3 Auto_Increment 잠금 메커니즘은 자동 증가 잠금 경쟁을 유발하여 특정 성능 손실을 초래합니다.
첨부: Auto_increment 잠금 경쟁 문제, 이를 개선하려면 innodb_autoinc_lock_mode 구성을 조정해야 합니다
3 . 요약
이 블로그는 먼저 처음에 질문하고, 테이블을 만들고, jdbcTemplate을 사용하여 대량의 데이터를 삽입할 때 다양한 ID 생성 전략의 성능을 테스트하는 것으로 시작합니다. 그런 다음 인덱스 구조와 장단점을 분석합니다. MySQL의 다양한 ID 메커니즘에 대한 심층 설명 이 문서에서는 uuid 및 임의의 비반복 ID가 데이터 삽입 시 성능 손실을 일으키는 이유를 설명하고 이 문제를 자세히 설명합니다.
실제 개발에서는 mysql의 공식 권장사항에 따라 self-increasing ID를 사용하는 것이 가장 좋습니다. MySQL은 넓고 심오하며, 최적화할 만한 내부 포인트가 많이 있습니다.
추천 학습: mysql 비디오 튜토리얼
위 내용은 MySQL이 uuid를 기본 키로 사용할 수 없는 이유에 대해 이야기해 보겠습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











MySQL은 오픈 소스 관계형 데이터베이스 관리 시스템입니다. 1) 데이터베이스 및 테이블 작성 : CreateAbase 및 CreateTable 명령을 사용하십시오. 2) 기본 작업 : 삽입, 업데이트, 삭제 및 선택. 3) 고급 운영 : 가입, 하위 쿼리 및 거래 처리. 4) 디버깅 기술 : 확인, 데이터 유형 및 권한을 확인하십시오. 5) 최적화 제안 : 인덱스 사용, 선택을 피하고 거래를 사용하십시오.

다음 단계를 통해 phpmyadmin을 열 수 있습니다. 1. 웹 사이트 제어판에 로그인; 2. phpmyadmin 아이콘을 찾고 클릭하십시오. 3. MySQL 자격 증명을 입력하십시오. 4. "로그인"을 클릭하십시오.

MySQL은 오픈 소스 관계형 데이터베이스 관리 시스템으로, 주로 데이터를 신속하고 안정적으로 저장하고 검색하는 데 사용됩니다. 작업 원칙에는 클라이언트 요청, 쿼리 해상도, 쿼리 실행 및 반환 결과가 포함됩니다. 사용의 예로는 테이블 작성, 데이터 삽입 및 쿼리 및 조인 작업과 같은 고급 기능이 포함됩니다. 일반적인 오류에는 SQL 구문, 데이터 유형 및 권한이 포함되며 최적화 제안에는 인덱스 사용, 최적화 된 쿼리 및 테이블 분할이 포함됩니다.

MySQL은 성능, 신뢰성, 사용 편의성 및 커뮤니티 지원을 위해 선택됩니다. 1.MYSQL은 효율적인 데이터 저장 및 검색 기능을 제공하여 여러 데이터 유형 및 고급 쿼리 작업을 지원합니다. 2. 고객-서버 아키텍처 및 다중 스토리지 엔진을 채택하여 트랜잭션 및 쿼리 최적화를 지원합니다. 3. 사용하기 쉽고 다양한 운영 체제 및 프로그래밍 언어를 지원합니다. 4. 강력한 지역 사회 지원을 받고 풍부한 자원과 솔루션을 제공합니다.

Redis는 단일 스레드 아키텍처를 사용하여 고성능, 단순성 및 일관성을 제공합니다. 동시성을 향상시키기 위해 I/O 멀티플렉싱, 이벤트 루프, 비 블로킹 I/O 및 공유 메모리를 사용하지만 동시성 제한 제한, 단일 고장 지점 및 쓰기 집약적 인 워크로드에 부적합한 제한이 있습니다.

MySQL 및 SQL은 개발자에게 필수적인 기술입니다. 1.MySQL은 오픈 소스 관계형 데이터베이스 관리 시스템이며 SQL은 데이터베이스를 관리하고 작동하는 데 사용되는 표준 언어입니다. 2.MYSQL은 효율적인 데이터 저장 및 검색 기능을 통해 여러 스토리지 엔진을 지원하며 SQL은 간단한 문을 통해 복잡한 데이터 작업을 완료합니다. 3. 사용의 예에는 기본 쿼리 및 조건 별 필터링 및 정렬과 같은 고급 쿼리가 포함됩니다. 4. 일반적인 오류에는 구문 오류 및 성능 문제가 포함되며 SQL 문을 확인하고 설명 명령을 사용하여 최적화 할 수 있습니다. 5. 성능 최적화 기술에는 인덱스 사용, 전체 테이블 스캔 피하기, 조인 작업 최적화 및 코드 가독성 향상이 포함됩니다.

데이터베이스 및 프로그래밍에서 MySQL의 위치는 매우 중요합니다. 다양한 응용 프로그램 시나리오에서 널리 사용되는 오픈 소스 관계형 데이터베이스 관리 시스템입니다. 1) MySQL은 웹, 모바일 및 엔터프라이즈 레벨 시스템을 지원하는 효율적인 데이터 저장, 조직 및 검색 기능을 제공합니다. 2) 클라이언트 서버 아키텍처를 사용하고 여러 스토리지 엔진 및 인덱스 최적화를 지원합니다. 3) 기본 사용에는 테이블 작성 및 데이터 삽입이 포함되며 고급 사용에는 다중 테이블 조인 및 복잡한 쿼리가 포함됩니다. 4) SQL 구문 오류 및 성능 문제와 같은 자주 묻는 질문은 설명 명령 및 느린 쿼리 로그를 통해 디버깅 할 수 있습니다. 5) 성능 최적화 방법에는 인덱스의 합리적인 사용, 최적화 된 쿼리 및 캐시 사용이 포함됩니다. 모범 사례에는 거래 사용 및 준비된 체계가 포함됩니다

Redis 데이터베이스의 효과적인 모니터링은 최적의 성능을 유지하고 잠재적 인 병목 현상을 식별하며 전반적인 시스템 신뢰성을 보장하는 데 중요합니다. Redis Exporter Service는 Prometheus를 사용하여 Redis 데이터베이스를 모니터링하도록 설계된 강력한 유틸리티입니다. 이 튜토리얼은 Redis Exporter Service의 전체 설정 및 구성을 안내하여 모니터링 솔루션을 원활하게 구축 할 수 있도록합니다. 이 자습서를 연구하면 완전히 작동하는 모니터링 설정을 달성 할 수 있습니다.
