묻고 답해요
143만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결비전공자도 이해할 수 있는 MySQL 성능 최적화 입문/실전 (SQL 튜닝편)
질문이있습니다.
제가 선생님 강의를보고테이블에 천만개의 데이터를 넣고 인덱스를 테스트하고있었는데요, 2가지 질문이 생겼습니다. 질문다음과 같이 익스플레인 에널라이즈를 하면 소요시간이 약 704ms 으로 나옵니다. 그런데 익스플레인 에널라이즈만 제거하고 다시 셀렉트를 하면 소요시간이 1.494로 증가하는데 단순 조회 쿼리와 익스플레인 에널라이즈 쿼리가 서로 다르게 동작해서 그런건가요? 분석때문에 에널라이즈쪽이 더 오래걸릴까 싶었는데 오히려 반대라서 왜 이런현상이 발생하는지 궁금합니다.-> Filter: ((reservation.userId = 389788) or (reservation.seatId = 50)) (cost=11192 rows=10272) (actual time=2.33..678 rows=10271 loops=1) -> Deduplicate rows sorted by row ID (cost=11192 rows=10272) (actual time=2.3..676 rows=10271 loops=1) -> Index range scan on reservation using idx_user over (userId = 389788) (cost=1.11 rows=1) (actual time=0.115..0.115 rows=0 loops=1) -> Index range scan on reservation using idx_seat over (seatId = 50) (cost=1038 rows=10271) (actual time=0.0497..2.77 rows=10271 loops=1) 질문제가 다음과 같은 쿼리에 인덱스를 걸며 테스트해보니복합인덱스 ( userId,seatId or reverse ) 는 전혀 인덱스를 활용하지않고 단일 인덱스를 각각 지정했을 경우에만 아래와같이 인덱스를 병합해서 사용하더라구요. 이렇게 속도를 절반으로 떨어뜨렸는데 아무래도 데이터가 천만개라 그런가 여전히 1초 이상의 시간이 소요되어서 선생님이 보셨을때 여기서 더 개선해볼 방법이 있는지 궁금합니다.where쪽을 건드려 보자니 둘중 하나라도 충족되면 가져와야하는 상황이라면 or 말고 다른건 떠오르질않았습니다.(에널라이즈는 시간이 1초 미만으로 나오지만 실제로 쿼리 돌려보면 소요시간 1.4초 이상으로 찍힙니다. ) CREATE INDEX idx_user ON reservation_entity(userId); CREATE INDEX idx_seat ON reservation_entity(seatId); SELECT `reservation`.`createdAt` AS `reservation_createdAt`, `reservation`.`updatedAt` AS `reservation_updatedAt`, `reservation`.`deletedAt` AS `reservation_deletedAt`, `reservation`.`id` AS `reservation_id`, `reservation`.`userId` AS `reservation_userId`, `reservation`.`concertId` AS `reservation_concertId`, `reservation`.`seatId` AS `reservation_seatId`, `reservation`.`status` AS `reservation_status`, `reservation`.`price` AS `reservation_price`, `reservation`.`concertName` AS `reservation_concertName`, `reservation`.`seatNumber` AS `reservation_seatNumber`, `reservation`.`openAt` AS `reservation_openAt`, `reservation`.`closeAt` AS `reservation_closeAt` FROM `reservation_entity` `reservation` WHERE `reservation`.`userId` = 389788 OR `reservation`.`seatId` = 50; -> Filter: ((reservation.userId = 389788) or (reservation.seatId = 50)) (cost=11192 rows=10272) (actual time=2.33..678 rows=10271 loops=1) -> Deduplicate rows sorted by row ID (cost=11192 rows=10272) (actual time=2.3..676 rows=10271 loops=1) -> Index range scan on reservation using idx_user over (userId = 389788) (cost=1.11 rows=1) (actual time=0.115..0.115 rows=0 loops=1) -> Index range scan on reservation using idx_seat over (seatId = 50) (cost=1038 rows=10271) (actual time=0.0497..2.77 rows=10271 loops=1)
-
미해결[2024 리뉴얼] 처음하는 SQL과 데이터베이스(MySQL) 부트캠프 [입문부터 활용까지]
강의 화면 출력이 되지 않는 현상
강의 화면이 제가 들었던 기록들을 제외하고는 음성만 들리고 영상이 보이지가 않습니다. 혹시 해결방안 있을까요?
-
미해결비전공자도 이해할 수 있는 MySQL 성능 최적화 입문/실전 (SQL 튜닝편)
테이블에 기본키가 없을때
강의를 듣다 궁금한 점이 생겨서 글을 남김니다.보통 테이블을 생성할때 당연하게 pk를 지정해 주었는데 pk가 없는 테이블도 생성을 하나요? 생성은 되는것 같은데 똑같이 테스트를 해보니 따로 정렬한는 기준이 없어서 그런지 id 7번을 2번으로 바꿔도 들어온 순서대로 위치가 맨 마지막에 있는것을 확인했습니다. pk가 없는 테이블도 있는지 있으면 성능이라던지 차이점이 뭔지 궁금합니다.
-
미해결비전공자도 이해할 수 있는 MySQL 성능 최적화 입문/실전 (SQL 튜닝편)
질문있어요!!!
인덱스를 생성할때, 오름차순 - 내림차순도 설정할수있는데,날짜 기준으로 '최신 날짜 기준'으로 자주 조회하는 쿼리일 때,인덱스를 날짜 기준으로 내림차순으로 만들면 쿼리에 더 효과가 있는 걸까요?아니면 정렬 설정 상관없이 '옵티마이저'가 알아서 판단해서 조회를 하는 건가요?? 그리고강의 너무 유익하게 듣고있습니다. 늘 좋은 강의 감사합니다
-
해결됨장래쌤과 함께하는 쉽고 재미있는 SQL 이야기
여러 컬럼 중 null값이 아닌 값 가져오기
안녕하세요 질문 드립니다! A 1 2 3 null 5 null null null 7 이렇게 A라는 항목에 한해서 9개의 컬럼이 있는데 중간 중간 null 값이 있는 경우 이전 값들 중 최근 값을 가져오게끔 하는 방법이 있을까요? 위 예시로, 빨간색 null 값은 3이 나와야되고 7 전의 null 값 3개에 대해서는 5, 5, 5 이렇게 나오게끔 하고싶습니다
-
해결됨장래쌤과 함께하는 쉽고 재미있는 SQL 이야기
누적 백분위 구하기 질문
선생님 안녕하세요 쿼리로 누적 백분위 구하려고하는데 질문드립니다 A 10B 20C 30D 40E 50Sum: 150이렇게 있을때 상위 10%, 20%, 30% .. 등등에 속하는 개수는 몇개인지 구하려하는데요 예를 들어 150의 10%인 15를 만족하는 갯수는 전체 중 1개( A = 10) 20%인 30 을 만족하는 갯수는 전체 중 2개 (A와 B) 전체 중 100%는 5개 (A, B, C, D, E) 이런식으로 누적 백분위를 구하고싶은데 이렇게도 가능할까요? 그럼 A+B 값이 10% 에 드는지 20%에 드는지 A+B+C 값은 몇프로에 드는지 각각 case when을 써서 비교해보려고했는데 누적 합산을 A+B, A+B+C 이렇게 끊어서 비교하는 방법을 모르겠습니다
-
미해결데이터베이스 중급(Modeling)
M:N관계 강의에서 말씀하신 표현
25:28 시간에"FK와 FK를 끄집어내고 테이블명을 끄집어 내면그 테이블은 해석이 되야지 잘 설계된 것이다"위 말씀의 의미를 좀 더 자세히 알 수 있을까요?
-
미해결데이터베이스 중급(Modeling)
릴레이션 개념
안녕하세요. 선생님용어를 습득하는데 별 탈없이 공부를 하던 중'릴레이션'이라는 용어를 마주하게 됐습니다.행 (row, tuple, record, instance) 여러 단어로 표현이 되듯릴레이션도 테이블(엔티티, 릴레이션) 이라고 표현하는 것 같습니다.(확실하진 않습니다ㅎㅎ)궁금한 점은 1:M, M:N, 1:1 관계를 배울 때 관계라는 영어명이 릴레이션이기 떄문에 용어가 좀 중구난방이라는 생각이 드는데 저만 이런 걸까요ㅎㅎ;;
-
미해결견고한 결제 시스템 구축
'더 견고해지기 위해 남은 작업' 수업자료
안녕하세요.다운로드한 수업자료에 '더 견고해지기 위해 남은 작업' 과 관련된 pdf 파일이 존재하지 않습니다 ㅠㅠ다른 질문글을 봤을땐 notion URL 를 제공했다고 하는데, 혹시 notion URL를 안내해주는 챕터가 어디일까요?더이상 Notion URL을 제공하지 않는다면 강의자료에 첨부해주실 수 있을까요?강의 잘 들었습니다. 감사합니다!
-
해결됨SW 개발자를 위한 성능 좋은 SQL 쿼리 작성법
13:57 쿼리실행화면 차이점
13:57 쯤에 나오는 쿼리 실행 화면이 강사님 화면과 좀 다른데 특별한 이유가 있을까요?차이점LEFT / RIGHT JOIN SORT
-
해결됨Real MySQL 시즌 1 - Part 1
전체 count(*) 내용에 대해서 문의 드립니다.
안녕 하세요..실제로 count(*) 때문에 고민이 많습니다.게시판 형태의 화면이 있는데요..데이터가 약 250만건 정도 입니다.조인된 테이블은 6개 이고요..테이블 6개를 조인 해서 보여주다 보니 검색 조건은 매우 많습니다.페이징을 20개씩 10페이지씩 보여주고 있는데요..강의 내용 대로 전체 count(*) 때문에 속도가 느립니다.전체 갯수를 소스 상에 써 놓고 테스트를 해보면 속도가 느리지 않거든여..강의를 보기 전에도 테스트 해본 결과 속도는 전체 갯수의 count(*) 문제 라고 판단 하고 있었는데요..시스템의 로우 갯수를 사용 하는 방법이나리눅스의 cron 으로 각 테이블의 갯수를 10분 단위로 입력 하는 것 등..여러가지 생각을 해보았으나..검색 때문에 포기 했습니다.검색을 하면 검색 결과에 대한 전체건수가 나와야 하는데..이건 실시간 아니면 파악할 수가 없으니까요..강의를 보면서 힌트를 얻고자 했으나..대략적인 건수..임의의 페이지 표기 통계 이용대략 이해는 됩니다만..만일 검색을 하게 되면..모두 사용 할 수 없는 것 아닌가요?강의 에서 얘기한 것들은 모두 아무런 조건이 없을 경우 이고..예를 들어 검색 조건이 10가지 정도 될 경우 어떤 조건으로 검색할 지 모르는 상황인데대략적인 건수를 표시할 수도 없고 임의의 페이지를 표시할 수도 없습니다.예를 들어 검색 조건 시 1개도 없는 경우도 있을 수 있는데..어떻게 대략적인 건수를 표시를 할 것이며..임의의 페이지를 표시 할 수 있을까요..검색결과가 1건도 나오지 않았는데 페이지를 1~10 까지 대략적으로 표시할 수는 없는 것 아닌가요?통계이용은 검색 시 더더욱 사용할 수 없고요..제시하신 방법으로는 문제가 해결 될 것 같지 않은데..제가 잘못 생각 하고 있는 걸까요?제 생각이 틀렸으면 좋겠습니다만..방법이 있을까요?
-
미해결[2024 리뉴얼] 처음하는 SQL과 데이터베이스(MySQL) 부트캠프 [입문부터 활용까지]
파이썬으로 다루는 MySQL
커리큘럼을 따라 잘 수강하고 있었는데 파이썬으로 다루는 MySQL부터 파이썬이 나와서 이해를 많이 못하고 있는 것 같습니다. 강의중에는 따로 설명하는 강의를 준비했다고 하시고 파이썬 입문과 크롤링 부트캠프으로 설명드렸다고 말씀해주셨는데 여기서부터는 강사님께서 강의하시는 파이썬 강의를 듣고 나서 수강하면 좋은건가요? 제가 business analyst로 이직 희망하고 있어서 SQL을 공부하고 있는건데 파이썬과 크롤링까지 할 필요가 있을지 의문이 들어서 질문남깁니다!
-
미해결[2024 리뉴얼] 처음하는 SQL과 데이터베이스(MySQL) 부트캠프 [입문부터 활용까지]
JOIN 활용 SQL 연습문제
연습문제메인 카테고리별로 할인 가격이 10만원 이상인 상품이 몇개 있는지를 출력해보기 (JOIN 활용 SQL 과 서브쿼리 활용 SQL 모두 작성해보기)정답은 첫번째 코드처럼 WHERE, GROUP BY절이 쓰였는데 저는 처음 이 문제를 보고 두번째 코드처럼 GROUP BY, Having 절을 생각해서 넣었더니 오류값이 나오더라구요 HAVING절이 GROUP BY 이후에 자주 쓰이기도 하고 집계도 넣을 수 있어서 똑같은 조건문을 WHERE 대신 HAVING절에 넣어줬는데 혹시 오류가 난 이유가 있을까요? 오류메세지는 Unknown column 'items.dis_price' in 'having clause'라고 떴습니다. 제가 GROUP BY가 쓰일때는 HAVING이랑 WHERE가 같은 역할을 하는것 같다고 생각하는데 어떤 부분에서 차이가 있는지 설명해주시면 좀 더 분명하게 이해할 수 있을 것 같습니다.SELECT ranking.main_category, COUNT(*) FROM ranking JOIN items ON items.item_code = ranking.item_code WHERE items.dis_price >= 100000 GROUP BY ranking.main_category;SELECT ranking.main_category, COUNT(*) FROM ranking JOIN items ON items.item_code = ranking.item_code GROUP BY ranking.main_category Having items.dis_price >= 100000;
-
미해결[2024 리뉴얼] 처음하는 SQL과 데이터베이스(MySQL) 부트캠프 [입문부터 활용까지]
Dbeaver 라는 SQL 쿼리 실행 툴을 써도 될까요?
업무에선 Dbeaver로 자주 돌렸거든요.혹시 Workbench 말고 디비버도 괜찮을까요?
-
해결됨Real MySQL 시즌 1 - Part 1
없는데이터에 select ... for update 쿼리시에 Lock
안녕하세요.예시를 위해 테이블명을 변경했습니다. 도메인상 이해안되도 이해부탁드립니다..!바로 질문으로 들어가면 아래에 쿼리를 발생시키면 supremum pseudo-record 락이 생기게 됩니다. 하지만 여기서 다른 세션에서 아래 쿼리를 똑같이 실행하면 select for update에서 락대기가 걸릴거라고 예상했는데 START TRANSACTION; #1 #reader_id+name 조합으로 유니크인덱스 사용중 SELECT * FROM book b WHERE reader_id = 21 AND name = 'ABC' FOR UPDATE; #2 INSERT INTO book VALUES (null, 'ABC', 21); #3아래 처럼 같은 락이 추가됩니다. 그래서 두 세션중 어느세션에서 insert 쿼리를 입력하든 Lock 대기가 걸리게됩니다. select에서 락대기가 걸리길 바랬는데 insert를 해야 락대기가 걸리는 이유가 무엇인가요?답변 미리 감사합니다.
-
해결됨SW 개발자를 위한 성능 좋은 SQL 쿼리 작성법
부록 영상 질문
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.2:40 결과를 보도록 하겠습니다2:46 이제 SQL 서버의 기본 동작부터 보도록 하시죠 영상에서 2:40 -> 2:46 로 넘어가는 부분이 이해가 안 됩니다 ㅠㅠ 혹시 중간에 영상이 잘린 건가요??
-
해결됨비전공자도 이해할 수 있는 MySQL 성능 최적화 입문/실전 (SQL 튜닝편)
실행 계획 type / 정렬 방식
안녕하세요 강사님! 실행 계획 type에 대해서 궁금한 점이 있습니다. ref가 UNIQUE가 아닌 컬럼의 인덱스를 사용한 경우라고 해주셨는데, 그러면 UNIQUE가 아닌 컬럼의 인덱스이지만 index나 range의 경우에 해당하면 해당 타입으로 표시되는 거고 저 둘(index, range)이 아닐 때, ref 타입으로 표시되는 걸까요? 그리고 한 가지 더 궁금한 점이 있는데, 만약 데이터를 조회한 결과들을 바로 View로 보내는 게 아니고 자바 코드를 사용한 계산을 통해 가공해야 하는 상황이라면 굳이 ORDER BY를 쓰지 않고, 데이터 조회 후, Collections.sort()와 같은 자바 코드로 정렬하는 편이 나을까요?
-
해결됨Real MySQL 시즌 1 - Part 2
파티셔닝의 자원 사용 효율 증가 관련 질문
"테이블 파티셔닝이 필요한 이유"중에 "자원 사용 효율 증가 및 쿼리 성능 향상"을 언급주셨습니다.예를들어 최근에 저장된 데이터들 위주로 조회하는 경우 파티션 프루닝을 통해 최근 데이터만 접근하니까 효율적이라는 내용인데요, 효율적인 부분이 제가 생각했을 때 아래 2가지 정도인 것 같습니다.테이블의 모든 row를 접근 안해도 되고 더 적은 데이터만 읽어도 됨버퍼풀에 자주 사용되는 일부 데이터만 로드해도 됨여기서 질문이 있습니다. 파티셔닝키를 대상으로 인덱스를 걸면, 마찬가지로 최근 데이터만 접근가능하고, 버퍼풀에 최근 데이터만 올라가지 않나요?인덱스를 거는 방식이 파티셔닝을 사용하는 것에 비해 어떤 점에서 부족한가요?
-
해결됨Real MySQL 시즌 1 - Part 2
INSERT에서 shared lock을 거는 이유 질문
"DeadLock 예시(2)"에서 INSERT구문이 UNIQUE를 보장하기위해 shared lock을 걸고 확인한다고하였는데요, 그냥 처음부터 exclusive lock을 걸고 값을 확인하게 구현할 수도 있을 것 같은데, 그렇게 안되어있는 특별한 이유가 있을까요?exclusive lock을 건 상태에서는 값이 있는지 확인이 불가능하다 (shared lock을 걸었을때만 가능하다)그냥 어쩌다보니 MySQL이 그렇게 구현되어있다.lock경합을 줄이기위한 의도로 이렇게 구현했다?제가 생각나는 이유는 위 2개 정도인데, 어떤 이유인지 아실까요?
-
해결됨Real MySQL 시즌 1 - Part 2
안녕하세요. 인덱스 관련 질문 있습니다.
에피소드 15에서 복합 인덱스의 경우 순서가 중요하다고 하셨는데요.그럼 인덱스 생성 시 (account_type, joined_at) 와 같은 순서일때 조건에 joined_at account_type 순서로 주어지면 인덱스를 활용하지 못하는게 맞을까요??