programing

MySQL - 인덱스를 만드는 기간은 얼마입니까?

closeapi 2023. 9. 8. 21:30
반응형

MySQL - 인덱스를 만드는 기간은 얼마입니까?

MySQL에 키 스케일을 추가하는 방법을 알려줄 수 있는 사람?데이터베이스에 500,000,000 행이 있습니다. 트랜스에는 열 i(INT 비서명됨), j(INT 비서명됨), nu(DOUBLE), A(DOUBLE)가 있습니다.예를 들어 열을 색인화하려고 합니다.

ALTER TABLE trans ADD KEY idx_A (A);

그리고 나는 기다린다.14,000,000 행의 테이블의 경우 MacBook Pro에서 실행하는 데 약 2분이 걸렸지만, 전체 5억 행의 경우에는 15시간이 소요됩니다.제가 뭔가 잘못하고 있는 것일까요, 아니면 데이터베이스 인덱싱이 행 수에 따라 어떻게 확장되는지에 대해 순진한 것일까요?

고려해야 할 몇 가지 요소가 있습니다.

  • 정렬은 N.log(N) 작업입니다.
  • 14M 행에 대한 정렬은 메인 메모리에 적합할 수도 있지만 500M 행에 대한 정렬은 그렇지 않을 수도 있으므로 디스크로 정렬이 흘러들어가서 작업 속도가 엄청나게 느려집니다.

요인의 크기가 약 30개이므로 빅 데이터 집합의 공칭 정렬 시간은 50배 - 2시간 미만입니다.그러나 데이터 값당 8바이트의 오버헤드가 필요합니다(인덱스에 저장된 내용에 대해 자세히 알고 있다면 mySQL로 튜닝).따라서, 14M × 16 ≈ 220 MB 메인 메모리.그러나 500M × 16 ≈ 8 GB 메인 메모리.시스템에 여유 메모리가 많이 남아 있고 MySQL이 이 메모리를 사용하도록 구성되어 있는 경우가 아니라면 대규모 정렬이 디스크로 유출되고 나머지 시간의 대부분을 차지합니다.

첫째, 테이블 정의가 여기서 큰 변화를 가져올 수 있습니다.NULL합니다.에는을다다을는에smen,r .NOT NULL될 수 있습니다. 이렇게 하면 색인의 공간이 절약되고 작성하는 동안 시간이 절약될 수 있습니다.

CREATE TABLE x ( 
  i INTEGER UNSIGNED NOT NULL, 
  j INTEGER UNSIGNED NOT NULL, 
  nu DOUBLE NOT NULL, 
  A DOUBLE NOT NULL 
);

데 를 은 이 하며 됩니다 과 됩니다 과 를 하며 REPAIR BY SORTING새더세트). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 이렇게 하면 다음과 같은 문제를 피할 수 있기 때문입니다.REPAIR BY SORTING인덱스가 인서트에 순차적으로 구축될 때 작동합니다.이 글에서 설명하는 비슷한 개념이 있습니다.

CREATE DATABASE trans_clone;
CREATE TABLE trans_clone.trans LIKE originalDB.trans;
ALTER TABLE trans_clone.trans ADD KEY idx_A (A);

청크에 대로), 에 에 를 을 에 를 을 사용하여 데이터를 덤프합니다.MYSQLDUMP:

mysqldump originalDB trans  --extended-insert --skip-add-drop-table --no-create-db --no-create-info > originalDB .trans.sql
mysql trans_clone < originalDB .trans.sql

이렇게 하면 데이터가 삽입되지만 인덱스 재구축(각 행이 삽입됨에 따라 인덱스가 구축됨)이 필요하지 않고 훨씬 빨리 완료됩니다.

제 경험으로는 하드웨어가 이에 대응할 수 있다면 MySQL로 큰 테이블을 색인화하는 것이 보통 꽤 선형적으로 확장됩니다.저는 지금까지 약 100,000,000 행의 테이블로 시도해 보았지만 주로 강력한 서버에서 노트북으로는 시도하지 않았습니다.

주로 하드웨어 요소, 사용 중인 테이블 엔진의 종류(MyIsam, INNO 등), 그리고 그 사이에 테이블이 사용 중인 경우 약간의 차이가 있을 것으로 생각됩니다.이 작업을 할 때는 CPU 사용량과 달리 디스크 사용량이 하늘을 찌릅니다.MacBook의 하드디스크에 대해서는 잘 모르지만 주변에서 가장 빠른 것은 아닌 것 같습니다.

MyISAM 테이블을 사용하는 경우 테이블 디렉토리의 인덱스 파일을 자세히 살펴보고 시간에 따라 어떻게 변경되는지 확인할 수 있습니다.

따라서 이론적으로 정렬 단계가 N.log(N) 작업인 경우 큰 테이블을 분할하면 작업 시간이 절약됩니다.

동일한 파일 100개로 분할된 500,000행 테이블에 대해 약 30% 증가: 500,000*log(500,000)= 4349 48,5002 및 100 *(500,000/100*LOG(500,000/100)) = 3349 48,5002 때문입니다.

저 같은 경우에는 4천만 장의 기록표를 가지고 있었는데 A를 포함해서 4개의 칼럼을 가지고 있었습니다.varchar기둥.색인 작성:INT컬럼은 코어 CPU 8개와 램 16G를 사용하면 4분 정도 소요됩니다.

언급URL : https://stackoverflow.com/questions/2483205/mysql-how-long-to-create-an-index

반응형