inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

176만명의 커뮤니티!! 함께 토론해봐요.

조회 대상 행이 적을 때도 Using filesort 제거를 고려해야 하나요?

미해결

김영한의 실전 데이터베이스 - 성능 최적화, 실행 계획과 인덱스 완전 정복

1. 인덱스로 이미 5~8행까지 좁혀진 결과를 정렬하는 경우에도 filesort를 주의해야 하나요? 2. 실무에서 "이 정도면 filesort를 신경 쓰지 않아도 된다"고 판단하는 기준(정렬 대상 행 수, 실행 시간 등)이 있다면 알려주시면 감사하겠습니다. 감사합니다.

  • sql
  • mysql
  • dbms/rdbms
  • sql-tuning
  • SQLD
슝스스 댓글 2 좋아요 0 조회수 22

SYSDATE 입력

미해결

SQLD 자격대비 과정

S3에 " 날짜(SYSDATE)의 경우 VARCHAR2 타입의 날짜 컬럼에 입력 시 TO_CHAR(SYSDATE, 'YYYYMMDD')와 같이 변환 후 입력값으로 사용해야 함. D" 라는 부분은 빈드시 그래야 한다는 오해의 소지가 있는 거 같습니다. 날짜 정보를 VARCHAR2 타입으로 관리하는 컬럼일 경우 반드시 TO_CHAR(SYSDATE, FORMAT)으로 캐스팅 해야 하지만 DATETIME 타입의 컬럼에는 캐스팅 하지 않아도 입력이 되나깐요.

  • sql
  • SQLD
happychohb 댓글 1 좋아요 0 조회수 35

테이블 생성 시 PK 및 제약조건 문의

미해결

SQLD 자격대비 과정

테이블 생성 시 PROD_ID가 PK라면 PROD_ID VARCHAR2(10) NOT NULL 에서 NOT NULL을 생략해도 되지 않나요 ?

  • sql
  • SQLD
happychohb 댓글 1 좋아요 0 조회수 42

TCL 문의

미해결

SQLD 자격대비 과정

문제 풀이 S3에서 TCL을 Tool Command Language 라고 해석이 되어 있는데 DB에서의 TCL은 Transaction Control Language가 맞지 않나요 ? TCL을 Tool Command Language는 개발영역에서 사용하는 개념인 것 같아서요

  • sql
  • SQLD
happychohb 댓글 1 좋아요 0 조회수 34

PK를 AUTO_INCREMENT UUID를 UNIQUE로 하는것에 대해

미해결

김영한의 실전 데이터베이스 - 성능 최적화, 실행 계획과 인덱스 완전 정복

질문이 있습니다 강의를 듣다보니 UUID를 써야겠다면 PK를 오토 인크리먼트 UNIQUE 를 UUID로 사용하라고 했는데 , 그리고 보안적인 측면으로 이야기하면서 오토인크리먼트는 유추 될수 있다 라고 하시면서 그러면 보안을 더 잘하는게 맞지 않냐는 말씀을 하셨습니다. 저도 말씀하신 생각과 같은데요 그런데 만약에 UUID와 오토 인크리먼트를 같이 쓰게되면 PK 값을 안보여주는 것도 이야기를 하셨는데 그러면 SELECT할때 WHERE 조건으로 UUID 즉 유니크 키를 사용하면 PK를 사용할때에 비해 이점이 줄지않나요? 그리고 문서 건수가 많아질수록 유니크 키 인덱스 부분도 쌓여서 비용이 쌓일거같은데 이부분이 궁금합니다.

  • sql
  • mysql
  • dbms/rdbms
  • sql-tuning
  • SQLD
안태승 댓글 2 좋아요 0 조회수 43

본질 및 인조 식별자 질문

해결됨

SQLD 자격대비 과정

본질이 업무에 의해 생성되는 것이라면 사실 이해가 잘 되지 않습니다. 업무라는 것이 조직의 목표 수행을 위해 이루어 지는 모든 행위라고 보면 사원번호 + 주문일자 + 순번 으로 구성된 주문번호도 업무 수행 즉 업무 관리를 위해 만든 식별자라고 생각할 수 있는게 아닌가 해서요 ? 만약 주문번호를 오라클 시퀀스같이 하나의 숫자로만 구성시키면 본질식별자가 되는 건가요 ?

  • sql
  • SQLD
happychohb 댓글 1 좋아요 0 조회수 33

pk를 auto increment로 하는것에 대해서

미해결

김영한의 실전 데이터베이스 - 성능 최적화, 실행 계획과 인덱스 완전 정복

안녕하세요 질문이 있습니다. b+트리 강의를 들으면서 문득 생각이 나서 질문드립니다.웹개발을 하는 회사원인데요 저희 회사에서는 pk를 랜덤 UUID를 사용해서 pk를 사용하고 있는데 프로젝트를 하면 마이그레이션을 하거나 할떄 꽤 많은 양을 합니다 수십만건 또는 수백만건 정도를 하는데 이 pk를 auto increment로만 바꿔도 성능이 많이 개선이 되나요?

  • sql
  • mysql
  • dbms/rdbms
  • sql-tuning
  • SQLD
안태승 댓글 2 좋아요 0 조회수 44

슈퍼키 문의

해결됨

SQLD 자격대비 과정

슈퍼키는 최소성을 만족하지 않아야 하는데 사번이나 주민번호 하나를 슈퍼키라고 할 수 있나요 ?

  • sql
  • SQLD
happychohb 댓글 1 좋아요 0 조회수 37

실행 통계2 explain analyze 조인 쿼리

미해결

김영한의 실전 데이터베이스 - 성능 최적화, 실행 계획과 인덱스 완전 정복

eXPLAIN ANALYZE SELECT m.member_name, o.total _price FROM orders o JOIN member m ON m.member_id = o.member_id; 위쿼리를 시작했는데 거의 수분 5분이 넘어도 결과가 나오는데 너무 오래 걸립니다. Nested loop inner join (cost=5.85e+6 rows=4.86e+6) (actual time=2.89..446250 rows=5e+6 loops=1) -> Table scan on o (cost=503796 rows=4.86e+6) (actual time=0.77..3714 rows=5e+6 loops=1) -> Single-row index lookup on m using PRIMARY (member_id=o.member_id) (cost=1 rows=1) (actual time=0.0882..0.0882 rows=1 loops=5e+6) 위는 실행 계획으로 약7분 26초가 걸렸습니다. 그리고 데이터 넣을떄도 orders부분도 한 한시간 넘게 걸렷던거 같습니다. 강의를 듣고싶은데 이부분은 그냥 오래걸리면 넘어가도 될까요? 컴퓨터 사양도 그렇게 나쁘지않습니다 32gb램을쓰고 있는데 뭔가 강의를 계속해서 듣고 싶은데 이런거 하나하나 막힐때마다 너무 오래걸려서 어떻게 해야될지를 모르겠습니다.

  • sql
  • mysql
  • dbms/rdbms
  • sql-tuning
  • SQLD
안태승 댓글 1 좋아요 0 조회수 56

68강 문제 풀이

미해결

김영한의 실전 데이터베이스 - 기본편

문제를 풀면서 66. 인덱스 설계 가이드 라인 에서 카디널리티 이야기가 나왔던게 생각이 났습니다. is_active는 값이 TRUE/FALSE 2개이므로 카디널리티가 낮을거라(중복도 높음) 생각했습니다. 그리하여 문제에서 주어진 쿼리를 보고 중간에서 is_active에서 풀 스캔 VS is_active 컬럼도 인덱스에 추가할지 고민이 되었습니다. 정답처럼 인덱스에 추가해주는게 더 나은 선택인걸까요? 음... 때에 따라 다른거 같기도 합니다! TRUE/FALSE의 비율 같은게 추가 조건으로 나왔더라면 선택하기 더 좋았을 거 같네요. 예를 들어, TRUE의 비율이 95% 다 이러면 인덱스를 달아주는 것과 풀 스캔이 별 차이가 없었을 거 같다는 생각이 드네요!

  • sql
  • mysql
  • dbms/rdbms
  • SQLD
thrkrif 댓글 1 좋아요 0 조회수 44

현대 쿼리 복잡성에 관한 질문

미해결

김영한의 실전 데이터베이스 - 설계 2편, 실무에서 반드시 마주치는 9가지 설계 패턴

안녕하십니까! 덕분에 수업 잘 듣고 있습니다! 쿼리를 쉽고 가독성 좋게 설계하면서 추가 비용이 드는 형태가 많이 보이는데 제가 실제 실무를 겪어보진 않았지만 직감적으로 느끼는 부분이 있습니다! LLM이 발전하면서 쿼리에 대한 작성 난이도가 낮아졌을거라고 예상하고 시간이 지날수록 이런 부분이 더 빠르게 발전될 것이라고 생각합니다! 그럼 쿼리 작성에 대한 비용이 낮아지면서 0에 가까워질 거 같은데 그럼에도 기존 소프트웨어 개발 실무에서 적용된 "쉬운 쿼리, 조금의 추가 비용"의 형태가 유지될까요?! 아니면 실제로 이러한 부분이 현업에서도 반영이 되고 있나요? 비즈니스 의도, 집단 환경에 따라 다르겠지만 영한님의 시선으로도 의견이 궁금해서 질문드립니다!

  • sql
  • mysql
  • dbms/rdbms
  • 소프트웨어-설계
  • SQLD
Jh P 댓글 3 좋아요 0 조회수 93

key_length 가 사용되는곳

미해결

김영한의 실전 데이터베이스 - 성능 최적화, 실행 계획과 인덱스 완전 정복

궁금한게 key_length 를 이용해서 어떻게 사용하는지에 대해서가 22강에서 안나왔는데 그 이후로 나오나요? key_len 이 기대한것보다 적으면 인덱스가 잘 사용되고 있지 않다고만 설명을 하고 지나가셨는데 이후에 key_len 값을가지고 개선 하는방법이 나오는지 알고싶습니다.

  • sql
  • mysql
  • dbms/rdbms
  • sql-tuning
  • SQLD
안태승 댓글 1 좋아요 0 조회수 49

공통 코드 VS Enum 클래스

미해결

김영한의 실전 데이터베이스 - 설계 2편, 실무에서 반드시 마주치는 9가지 설계 패턴

DB에 공통 코드를 저장하는 테이블을 만드는 것과 코드에서 Enum 클래스를 만들어서 관리하는 것 중 어떤 방법이 더 괜찮은걸까요?? 각 방식의 장단점이 있을까요??

  • sql
  • mysql
  • dbms/rdbms
  • 소프트웨어-설계
  • SQLD
꼬여사님 댓글 1 좋아요 1 조회수 51

강의 DB데이터 질문

미해결

김영한의 실전 데이터베이스 - 성능 최적화, 실행 계획과 인덱스 완전 정복

--order 프로시저 DELIMITER $$ CREATE PROCEDURE sp_generate_orders(IN p_count INT) BEGIN DECLARE v_i INT DEFAULT 0; DECLARE v_batch_size INT DEFAULT 2000; DECLARE v_member_id BIGINT; DECLARE v_item_count INT; DECLARE v_product_id BIGINT; DECLARE v_unit_price INT; DECLARE v_total INT; DECLARE v_order_id BIGINT; DECLARE v_j INT; DECLARE v_status VARCHAR(20); DECLARE v_rand DOUBLE; DECLARE v_days_ago INT; DECLARE v_max_member BIGINT; DECLARE v_max_product BIGINT; DECLARE v_base_date DATETIME DEFAULT '2026-04-01 00:00:00'; SELECT MAX(member_id) INTO v_max_member FROM member; SELECT MAX(product_id) INTO v_max_product FROM product; SET autocommit = 0; WHILE v_i < p_count DO SET v_rand = RAND(); IF v_rand < 0.12 THEN SET v_member_id = FLOOR(RAND() FLOOR(v_max_member 0.02)) + FLOOR(v_max_member * 0.98) + 1; ELSEIF v_rand < 0.35 THEN SET v_member_id = FLOOR(RAND() FLOOR(v_max_member 0.08)) + FLOOR(v_max_member * 0.90) + 1; ELSEIF v_rand < 0.59 THEN SET v_member_id = FLOOR(RAND() FLOOR(v_max_member 0.20)) + FLOOR(v_max_member * 0.70) + 1; ELSE SET v_member_id = FLOOR(RAND() FLOOR(v_max_member 0.70)) + 1; END IF; SET v_rand = RAND(); IF v_rand < 0.50 THEN SET v_days_ago = FLOOR(RAND() * 180); ELSE SET v_days_ago = 180 + FLOOR(RAND() * 915); END IF; SET v_rand = RAND(); SET v_status = CASE WHEN v_rand < 0.60 THEN 'DELIVERED' WHEN v_rand < 0.70 THEN 'SHIPPED' WHEN v_rand < 0.80 THEN 'PAID' WHEN v_rand < 0.90 THEN 'ORDERED' ELSE 'CANCELLED' END; INSERT INSERT INTO orders (member_id, order_status, total_price, ordered_at) VALUES (v_member_id, v_status, 0, DATE_SUB(v_base_date, INTERVAL v_days_ago DAY) + INTERVAL FLOOR(RAND() * 86400) SECOND); SET v_order_id = LAST_INSERT_ID(); SET v_item_count = 1 + FLOOR(RAND() RAND() 5) SET v_total = 0; SET v_j = 0; WHILE v_j < v_item_count DO SET v_rand = RAND(); IF v_rand < 0.30 THEN SET v_product_id = FLOOR(RAND() (v_max_product 0.01)) + 1; ELSE SET v_product_id = FLOOR(RAND() * v_max_product) + 1; END IF; SET v_unit_price = GREATEST(1000, ROUND(EXP(RAND() 3.0 + 8.0) / 100) 100); INSERT INTO order_item (order_id, product_id, quantity, unit_price) VALUES (v_order_id, v_product_id, 1 + FLOOR(RAND() * 3), v_unit_price); SET v_total = v_total + v_unit_price; SET v_j = v_j + 1; END WHILE; UPDATE orders SET total_price = v_total WHERE order_id = v_order_id; SET v_i = v_i + 1; IF v_i % v_batch_size = 0 THEN COMMIT; END IF; END WHILE; COMMIT; SET autocommit = 1; END$$ DELIMITER ; --리뷰 프로시저 DELIMITER $$ CREATE PROCEDURE sp_generate_reviews(IN p_count INT) BEGIN DECLARE v_i INT DEFAULT 0; DECLARE v_batch_size INT DEFAULT 5000; DECLARE v_product_id BIGINT; DECLARE v_member_id BIGINT; DECLARE v_rating TINYINT; DECLARE v_rand DOUBLE; DECLARE v_max_member BIGINT; DECLARE v_max_product BIGINT; DECLARE v_base_date DATETIME DEFAULT '2026-04-01 00:00:00'; SELECT MAX(member_id) INTO v_max_member FROM member; SELECT MAX(product_id) INTO v_max_product FROM product; SET autocommit = 0; WHILE v_i < p_count DO SET v_rand = RAND(); IF v_rand < 0.40 THEN SET v_product_id = FLOOR(RAND() (v_max_product 0.05)) + 1; ELSE SET v_product_id = FLOOR(RAND() * v_max_product) + 1; END IF; SET v_member_id = FLOOR(RAND() * v_max_member) + 1; SET v_rand = RAND(); SET v_rating = CASE WHEN v_rand < 0.30 THEN 5 WHEN v_rand < 0.60 THEN 4 WHEN v_rand < 0.75 THEN 3 WHEN v_rand < 0.90 THEN 2 ELSE 1 END; INSERT INTO review ( product_id, member_id, rating, content, created_at ) VALUES ( v_product_id, v_member_id, v_rating, CASE WHEN RAND() < 0.5 THEN CONCAT('리뷰 내용 ', v_i) ELSE NULL END, DATE_SUB( v_base_date, INTERVAL FLOOR(RAND() * 1095) DAY ) ); SET v_i = v_i + 1; IF v_i % v_batch_size = 0 THEN COMMIT; END IF; END WHILE; COMMIT; SET autocommit = 1; END$$ DELIMITER ; 위 상태에서 멈춰있어요 지금 order관련된 프로시저랑 review 관련된 프로시저가 너무 오래걸려서 안되는데 확인 부탁드립니다.

  • sql
  • mysql
  • dbms/rdbms
  • sql-tuning
  • SQLD
댓글 1 좋아요 0 조회수 67

극단적으로 from-to가 12일 이고, valid_to가 13일이면?

미해결

김영한의 실전 데이터베이스 - 설계 2편, 실무에서 반드시 마주치는 9가지 설계 패턴

안녕하세요, 해당 내용을 보다가 의문이 있어 질문남깁니다. SELECT SUM(stock_quantity) AS total_stock FROM product WHERE '2026-01-13 23:59:59' >= valid_from AND '2026-01-13 23:59:59' < valid_to; 해당 쿼리에서 valid_to가 13일 이면 13일 기준 데이터에서 위 쿼리에서는 제외되는데 그렇다면 AND '2026-01-13 00:00:00' < valid_to 조건은 틀린건가요?

  • sql
  • mysql
  • dbms/rdbms
  • 소프트웨어-설계
  • SQLD
트릴 댓글 1 좋아요 0 조회수 47

아니 이거 갑자기 데이터베이스가 사라졌어요

미해결

김영한의 실전 데이터베이스 입문 - 모든 IT인을 위한 SQL 첫걸음(SQL부터 차근차근)

[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] SQL 치다가 갑자기 오류가 나서 확인해보니 my_shop 데이터베이스가 사라지고 아래처럼 RECOVER_YOUR_DATA 무슨 복구프로그램 같은 느낌으로 되어있는데 이건 어떻게 해야하는거죠?

  • sql
  • mysql
  • dbms/rdbms
  • SQLD
조성경 댓글 1 좋아요 0 조회수 75

기타 영역 중 언두로그

미해결

김영한의 실전 데이터베이스 - 성능 최적화, 실행 계획과 인덱스 완전 정복

안녕하세요 RealMySQL책을 참고해서 보면서 강의를 듣고 있습니다 책에는 InnoDB가 언두로그를 메모리에서 관리한다고 되어있는데 강의와 책 중 어떤 자료가 맞는 것인지 궁금하여 질문드립니다

  • sql
  • mysql
  • dbms/rdbms
  • sql-tuning
  • SQLD
김상형 댓글 1 좋아요 0 조회수 91

실전튜닝 4 질문 - group by 순서와 index 순서

미해결

김영한의 실전 데이터베이스 - 성능 최적화, 실행 계획과 인덱스 완전 정복

SELECT m.member_id, m.member_name, m.grade, COUNT(o.order_id) AS order_count, SUM(o.total_price) AS total_spent FROM member m JOIN orders o ON m.member_id = o.member_id WHERE m.grade = 'VIP' GROUP BY m.member_id, m.member_name, m.grade ORDER BY total_spent DESC LIMIT 20; 안녕하세요! 해당 쿼리에서는 group by 순서가 member_id, member_name, grade 순으로 되어있습니다. 강의에서는 group by 는 그룹핑을 할때 (member_id, member_name, grade) 을 기준으로 그룹핑 하여 순서가 상관없지만 인덱스 순서를 GROUP BY 순서에 맞게 인덱스를 설계 해야한다고 하셨습니다. grade 는 where 절에서 vip 상수로 필터링 하므로 인덱스에서 가장 왼쪽(앞)에 와야하지만 왜 member_id, member_name 순서에 맞게 인덱스를 줘야하는지 잘 모르겠습니다. 실제로 (grade, member_name, member_id) 순서로 member 테이블에 인덱스를 주고 EXPLAIN ANALZYZE 를 해보니 Aggregate using temporary table (actual time=373..373 rows=59999 loops=1) 가 나오는것을 확인했습니다. 임시테이블을 만들지 말지의 기준은 GROUP BY 로 그룹핑 하는 대상들이 연속적으로 올 경우는 굳이 임시테이블을 만들 필요가 없다는것으로 이해를 했습니다.(순서대로 오니까 미리 저장할 필요가 없으므로) 하지만 인덱스를 (grade, member_name, member_id) 순서로 줄 경우도 결국 인덱스 Grouping 순서에 맞게 오니까 임시테이블을 만들 필요가 없으니까 using temporary table 역시 발생하지 않아야 하는거 아닌가요? 그리고 설령 (grade, member_name, member_id) 로 주지 않고 (grade, member_name) 로 member테이블에 인덱스를 걸더라도 되는거 아닌가요? 어차피 세컨더리 인덱스 리프노드에는 member_id (pk) 가 선행컬럼을 기준으로 정렬되어 존재하니깐용 감사합니다!

  • sql
  • mysql
  • dbms/rdbms
  • sql-tuning
  • SQLD
gmldk3214 댓글 1 좋아요 0 조회수 69

DB 쿼리 최적화 시 DB 처리와 애플리케이션 처리의 기준이 궁금합니다

미해결

김영한의 실전 데이터베이스 - 성능 최적화, 실행 계획과 인덱스 완전 정복

DB 쿼리를 설계하면서 항상 궁금했던 점이 있습니다. 쿼리가 점점 복잡해지다 보면 Sort , GROUP BY 등의 연산을 DB에서 처리하는 것보다, 데이터를 애플리케이션으로 가져온 후 애플리케이션에서 처리하는 것이 더 효율적이지 않을까 하는 생각이 들 때가 있습니다. 그렇다면 일반적으로 DB 쿼리를 최적화할 때는 애플리케이션으로 데이터를 가져와 처리하기보다는, 적절한 Index 설계를 통해 가능한 한 DB에서 연산을 처리하는 것이 맞는 방향일까요? 아니면 상황에 따라서는 필요한 데이터를 DB에서 조회한 후, 일부 연산을 애플리케이션에서 처리하는 것도 하나의 최적화 방법이 될 수 있을까요? 제가 생각하는 방향 자체가 잘못된 것인지, 아니면 실제로 상황에 따라 고려할 수 있는 방법인지 궁금해서 질문드립니다.

  • sql
  • mysql
  • dbms/rdbms
  • sql-tuning
  • SQLD
magicsof 댓글 1 좋아요 0 조회수 65

인기 태그

인프런 TOP Writers

주간 인기글