인프런 커뮤니티 질문&답변

전종복( Jong Bok Jun)님의 프로필 이미지
전종복( Jong Bok Jun)

작성한 질문수

비전공자도 이해할 수 있는 MySQL 성능 최적화 입문/실전 (SQL 튜닝편)

[실습] 인덱스를 무식하게 많이 걸면 어떻게 될까?

인덱스 많은 테이블에서 데이터 많아질 수록 insert 속도 증가

해결된 질문

작성

·

43

0

-- 테이블 A: 인덱스가 없는 테이블

CREATE TABLE test_table_no_index (

id INT AUTO_INCREMENT PRIMARY KEY,

column1 INT,

column2 INT,

column3 INT,

column4 INT,

column5 INT,

column6 INT,

column7 INT,

column8 INT,

column9 INT,

column10 INT

);

 

-- 테이블 B: 인덱스가 많은 테이블

CREATE TABLE test_table_many_indexes (

id INT AUTO_INCREMENT PRIMARY KEY,

column1 INT,

column2 INT,

column3 INT,

column4 INT,

column5 INT,

column6 INT,

column7 INT,

column8 INT,

column9 INT,

column10 INT

);

 

 

-- 각 컬럼에 인덱스를 추가

CREATE INDEX idx_column1 ON test_table_many_indexes (column1);

CREATE INDEX idx_column2 ON test_table_many_indexes (column2);

CREATE INDEX idx_column3 ON test_table_many_indexes (column3);

CREATE INDEX idx_column4 ON test_table_many_indexes (column4);

CREATE INDEX idx_column5 ON test_table_many_indexes (column5);

CREATE INDEX idx_column6 ON test_table_many_indexes (column6);

CREATE INDEX idx_column7 ON test_table_many_indexes (column7);

CREATE INDEX idx_column8 ON test_table_many_indexes (column8);

CREATE INDEX idx_column9 ON test_table_many_indexes (column9);

CREATE INDEX idx_column10 ON test_table_many_indexes (column10);

 

 

 

-- 높은 재귀(반복) 횟수를 허용하도록 설정

-- (아래에서 생성할 더미 데이터의 개수와 맞춰서 작성하면 된다.)

SET SESSION cte_max_recursion_depth = 100000;

 

-- 인덱스가 없는 테이블에 데이터 10만개 삽입

INSERT INTO test_table_no_index (column1, column2, column3, column4, column5, column6, column7, column8, column9, column10)

WITH RECURSIVE cte AS (

SELECT 1 AS n

UNION ALL

SELECT n + 1 FROM cte WHERE n < 100000

)

SELECT

FLOOR(RAND() * 1000),

FLOOR(RAND() * 1000),

FLOOR(RAND() * 1000),

FLOOR(RAND() * 1000),

FLOOR(RAND() * 1000),

FLOOR(RAND() * 1000),

FLOOR(RAND() * 1000),

FLOOR(RAND() * 1000),

FLOOR(RAND() * 1000),

FLOOR(RAND() * 1000)

FROM cte;

 

-- 인덱스가 많은 테이블에 데이터 10만개 삽입

INSERT INTO test_table_many_indexes (column1, column2, column3, column4, column5, column6, column7, column8, column9, column10)

WITH RECURSIVE cte AS (

SELECT 1 AS n

UNION ALL

SELECT n + 1 FROM cte WHERE n < 100000

)

SELECT

FLOOR(RAND() * 1000),

FLOOR(RAND() * 1000),

FLOOR(RAND() * 1000),

FLOOR(RAND() * 1000),

FLOOR(RAND() * 1000),

FLOOR(RAND() * 1000),

FLOOR(RAND() * 1000),

FLOOR(RAND() * 1000),

FLOOR(RAND() * 1000),

FLOOR(RAND() * 1000)

FROM cte;


를 그대로 사용했는데,

index 가 많은 테이블에 데이터가 많아질 수록

insert 시 속도가 느려져야 될 것 같은데 느려지지 않는 것 같습니다.

auto commit 모드이고
결과는
1차 : 10만개 삽입시 소요시간 3s
2차 : 10만개 삽입시 소요시간 4s
3차 : 10만개 삽입시 소요시간 4s
4차 : 10만개 삽입시 소요시간 4s
5차 : 10만개 삽입시 소요시간 4s
6차 : 10만개 삽입시 소요시간 4s

입니다. 뭔가 db 환경 문제일까요?
db : MariaDB
version: 10.6.15 입니다.

image.png

 

답변 3

0

JSCODE 박재성님의 프로필 이미지
JSCODE 박재성
지식공유자

안녕하세요 종복님! 좋은 고민하고 계시네요:)

 

'index가 적은 테이블에 데이터를 넣는 것'에 비해 'index가 많은 테이블에 데이터를 넣는 것'이

insert 시 속도가 느려지는 건 확실합니다!

 

하지만 index가 많은 테이블 자체에서 데이터의 개수에 따라

데이터 삽입 속도가 차이나는 건 미미할 수 있습니다.

즉, index가 많은 테이블이라고 하더라도 정말 방대한 크기의 데이터 양이 아니라면

데이터 insert 속도에는 차이가 눈에 보일 정도로는 안 생길 수도 있습니다!

 

제가 드린 답변을 보고 여전히 이해 안 되시는 점이 있다면

다시 한번 질문 남겨주세요:D

아, 강의에서는 같은 코드로 했을 때 차이가 계속 벌어졌는데
저는 차이가 안 벌어져서 의아해 했습니다.

mysql 과 mariadb 차이와
insert 시 데이터 크기가 방대하지 않은 문제일 수 있겠네요.

답변 감사합니다 🙂

0

ENGINE=InnoDB 인데 해당 엔진 때문에 데이터가 많아짐에도 insert 시 성능이 더 느려지지 않는 걸까요?

0

안녕하세요, 인프런 AI 인턴입니다. 전종복( Jong Bok Jun)님께서 올리신 질문에 대해 예전의 유사한 질문과 관련하여 도움을 드리고자 합니다.

질문하신 “인덱스가 많은 테이블에서 데이터가 많아질수록 insert 속도가 증가하지 않는 현상”은 여러 요인에 의해 발생할 수 있습니다. 주로 인덱스가 많은 테이블에 새로운 데이터를 삽입할 때, 인덱스 업데이트로 인해 성능 저하가 발생하는 것이 일반적입니다. 하지만 아래의 몇 가지 점을 확인하실 수 있습니다.

  1. 데이터베이스 엔진: MariaDB의 경우, InnoDB가 기본 엔진으로 설정되어 있을 가능성이 큽니다. InnoDB는 대량 데이터 삽입 시 트랜잭션 단위로 처리하여 일부 성능 최적화를 수행할 수 있습니다.

  2. 버퍼 및 캐싱: 데이터베이스 서버가 사용하는 버퍼나 캐싱 메커니즘이 일부 삽입 성능 저하를 막아줄 수 있습니다. 예를 들어, DB의 메모리 설정이나 버퍼 크기가 충분하면 캐쉬 활용에 의해 성능이 덜 저하될 수 있습니다.

  3. 실제 성능 테스트: 삽입 성능이 시간이 지남에 따라 꾸준히 유지되는 것은 데이터베이스의 효율적인 캐시 관리 및 설정 때문일 수 있습니다. INSERT 문 실행 시의 실제 리소스 사용량 및 쿼리 프로파일링을 통해 더 디테일한 원인을 파악하는 것이 좋습니다.

비슷한 문제를 다룬 예전의 답변도 참조할 수 있는데요, 아래를 참고하시면 좋습니다. 여기에서 고급 인덱싱 기법과 삽입 성능 관련 추가 팁을 확인할 수 있습니다.

지금 말씀드린 내용들이 상황을 조금이나마 이해하고 해결하는 데 도움이 되길 바랍니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

전종복( Jong Bok Jun)님의 프로필 이미지
전종복( Jong Bok Jun)

작성한 질문수

질문하기