Skip to content

최세민 7주차 학습일지 ‐ JSP cafe (3)

Semin Choi edited this page Sep 1, 2024 · 7 revisions

회고

현재 주어진 상황에서 최선을 다하자.

한기용님의 'AI 시대에서 살아남는 개발자 마인드셋' 특강을 들으며 어떤 상황이든 최선을 다하자는 교훈을 얻었습니다.

저는 맡겨진 것은 최선을 다해서 하는 편이긴 합니다. 그럼에도 무언가에 굉장히 몰입해서 나아가다보면, '지금 이걸 내가 왜하고 있지?' 라는 의문이 들 때가 종종 있습니다. 주로 이런 고민은 '지금 내가 이것을 함으로써 미래에 도움이 될까?' 라는 불안감에서 시작되었던 것 같습니다.

한기용님께서는 현재 주어진 것을 열심히 해서 주변 사람들에게 좋은 평판을 얻으면 나중에도 좋은 기회가 생길 것이라고 했습니다.

평판을 생각하지 않더라도 무언가를 열심히 하지 않으면 그것을 통해서 어떤 성장을 할 수 있는지 알 수 없다고 생각합니다. 새로운 지식이나 교훈 등을 배움으로써 성장하게 되는 것인데, 해보지 않고 도움이 되지 않는다고 단정하는 것은 모르는 것을 안다고 하는 것과 같고 이는 모순적이기 때문입니다.

지금까지 잘 해왔다는 것에 자신감이 생겼고, 종종 불안감이 생길 때도 이번에 배운 것을 떠올리며 최선을 다 해야겠다고 다짐했습니다.

배운 점

EXPLAIN 으로 쿼리 실행 계획 분석하기

쿼리 실행계획은 데이터베이스가 쿼리를 실행할 때 어떤 방식으로 처리할 지 알려주는 좋은 도구입니다. 이를 통해서 쿼리가 의도한 대로 인덱스를 사용하는지, 과도한 리소스를 사용하진 않는지 확인할 수 있습니다.

쿼리 실행 계획은 EXPLAIN 키워드를 사용해서 조회할 수 있습니다.

좀 더 자세하게 쿼리 실행 계획에 대해 알아보기 위해 아래와 같은 쿼리를 예시로 실행 계획을 분석해보도록 하겠습니다.

SELECT a.id
FROM   (SELECT id
        FROM   articles
        WHERE  activate = true
        ORDER  BY id DESC
        LIMIT  15 offset 400000) AS sub
       JOIN articles AS a
         ON sub.id = a.id 

위 쿼리는 커버링 인덱스를 사용해서 일반 offset 쿼리보다 게시글의 페이지네이션 성능을 개선한 쿼리입니다. 위 쿼리에 대해서 EXPLAIN 으로 실행 계획을 조회하면 아래와 같은 테이블을 볼 수 있습니다.

+----+-------------+------------+------------+--------+-------------------------+-----------------+---------+--------+--------+----------+--------------------------+
| id | select_type | table      | partitions | type   | possible_keys           | key             | key_len | ref    | rows   | filtered | Extra                    |
+----+-------------+------------+------------+--------+-------------------------+-----------------+---------+--------+--------+----------+--------------------------+
|  1 | PRIMARY     | <derived2> | NULL       | ALL    | NULL                    | NULL            | NULL    | NULL   |  49234 |   100.00 | Using temporary          |
|  1 | PRIMARY     | a          | NULL       | eq_ref | PRIMARY,idx_id_activate | PRIMARY         | 8       | sub.id |      1 |   100.00 | Using index              |
|  2 | DERIVED     | articles   | NULL       | index  | idx_id_activate         | idx_id_activate | 9       | NULL   | 400015 |    10.00 | Using where; Using index |
+----+-------------+------------+------------+--------+-------------------------+-----------------+---------+--------+--------+----------+--------------------------+

쿼리 실행 계획에서 중점적으로 봐야 하는 부분은 Extra 부분입니다. Extra는 쿼리 실행 계획에서 주요 세부 정보를 알려주는 필드입니다.

Using index Extra의 값으로 Using index가 있으면 인덱스를 사용해서 쿼리가 실행된다는 것을 의미합니다. possible_keys는 해당 쿼리를 실행할 때 사용할 수 있는 인덱스들 입니다. key는 실제로 쿼리를 수행할 때 사용하게 될 인덱스입니다.

**Using temporary,Using filesort ** Using temporaryUsing filesort는 성능이 저하 될 수 있는 요소입니다.

Using temporary는 임시 테이블을 생성해서 쿼리를 수행한 것을 의미하며 성능에 좋지 않은 영향을 줍니다. 만약, 임시 테이블 실행이 디스크수준에서 더욱 성능저하의 원인이 될 수 있습니다.

Using filesort는 테이블이 인덱스로 정렬되지 않아서 별도로 정렬을 수행한 것을 의미합니다. 마찬가지로 정렬해야 하는 양이 많아서 디스크 I/O 가 발생하게 되면 성능 저하의 원인이 될 수 있습니다.

👼 개인 활동을 기록합시다.

개인 활동 페이지

🧑‍🧑‍🧒‍🧒 그룹 활동을 기록합시다.

그룹 활동 페이지

🎤 미니 세미나

미니 세미나

🤔 기술 블로그 활동

기술 블로그 활동

📚 도서를 추천해주세요

추천 도서 목록

🎸 기타

기타 유용한 학습 링크

Clone this wiki locally