sourcecode

동일한 테이블 내의 여러 스레드에 배치 삽입을 사용한 MySQL 벤치마크

copyscript 2022. 9. 24. 10:12
반응형

동일한 테이블 내의 여러 스레드에 배치 삽입을 사용한 MySQL 벤치마크

InnoDB와 MySQL 데이터베이스의 MyRock 엔진 간의 고강도 쓰기를 테스트하고 싶습니다.이를 위해 sysbench를 사용하여 벤치마킹합니다.요구 사항은 다음과 같습니다.

  • 여러 스레드 동시성이 동일한 테이블에 기록됩니다.
  • 배치 삽입 지원(각 삽입 트랜잭션에서 대량의 레코드가 삽입됩니다.

sysbench의 모든 사전 테스트를 확인했지만 요건을 충족하는 테스트를 찾을 수 없습니다.

  • oltp_write_only: 는 같은 테이블에 쓰는 여러 스레드를 지원합니다.하지만 이 테스트에는 대량 삽입 옵션이 없습니다.
  • bulk_insert: 여러 스레드를 지원하지만 각 스레드는 다른 테이블에 씁니다.

요건을 충족하는 사전 시스템벤치 테스트가 있습니까?그렇지 않은 경우 이미 이 작업이 완료된 커스텀 Lua 스크립트를 찾을 수 있습니까?

(댓글에서:)

CREATE TABLE IF NOT EXISTS `tableA` (
    `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, 
    `user_id` VARCHAR(63) NOT NULL DEFAULT '', 
    `data` JSON NOT NULL DEFAULT '{}', 
    PRIMARY KEY (`id`), 
    UNIQUE INDEX `user_id_UNIQUE` (`user_id` ASC)
) ENGINE = InnoDB;

(MySQL 관점에서...)

  • 토스idPK는 행당 8바이트를 절약합니다.
  • 촉진하다UNIQUE(user_id)로.PRIMARY KEY(user_id)-- 행당 40바이트를 절약할 수 있습니다(온 상태).LENGTH(user_id)).

그런 의지는

  • 필요한 디스크 I/O 축소(일부 속도 향상)
  • 인덱스 중 하나 삭제(아마도 포스트 로드 처리의 중요한 부분)

OS 감시 툴을 실행하여 I/O 사용률을 확인합니다.그것이 한계 요인이 될 것 같다.

벤치마크 제품은 제한된 상황에서 유용합니다.고객의 상황(및 그 외의 많은 경우)에 대해서는, 제품을 빌드해 타이밍을 맞추는 것이 최선입니다.

또 다른 생각은...

JSON은 어떻게 생겼나요?JSON이 단순한 구조(키: 값 쌍의 일관된 세트)인 경우 개별 열을 만들면 Disk 설치 공간이 절반(따라서 속도가 두 배로 증가)될 수 있습니다.JSON에서 개별 컬럼으로 변경하는 처리는 클라이언트에서 이루어지며, 이로 인해 예상한 절감액이 상쇄될 수도 있고 상쇄되지 않을 수도 있습니다).

JSON이 더 복잡할 경우 항상 존재하는 "컬럼"을 추출하여 비용을 절감할 수 있습니다.

JSON이 '크다'면 클라이언트에서 JSON을 압축한 후BLOB이로 인해 디스크 설치 공간과 네트워크 대역폭이 3배로 줄어들 수 있습니다.

250만 줄에 250GB라고 하셨죠?1000바이트/행입니다.즉, JSON은 평균 700바이트입니까?(주의: 오버헤드가 있습니다.)JSON 컬럼의 압축BLOB총 400바이트/행으로 줄어들기 때문에 250M 행의 경우 100GB에 불과합니다.

{"b": 100}열 살이에요.를 b에 할 수 SMALLINT록을을상상상상축축축수수수

하나 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★user_idPK에 대해서, 이것은 고려할 가치가 있습니다.파일을 로드하기 전에 파일 정렬을 사용하여 테이블을 user_id별로 정렬합니다.이것은 아마도 보다 빠를 것이다.INSERTing행은 '랜덤'입니다.(데이터가 이미 정렬되어 있으면 이 추가 정렬이 낭비됩니다.)

언급URL : https://stackoverflow.com/questions/56859033/benchmark-mysql-with-batch-insert-on-multiple-threads-within-same-table

반응형