-
Notifications
You must be signed in to change notification settings - Fork 0
최세민 7주차 학습일지 ‐ JSP cafe (3)
한기용님의 'AI 시대에서 살아남는 개발자 마인드셋' 특강을 들으며 어떤 상황이든 최선을 다하자는 교훈을 얻었습니다.
저는 맡겨진 것은 최선을 다해서 하는 편이긴 합니다. 그럼에도 무언가에 굉장히 몰입해서 나아가다보면, '지금 이걸 내가 왜하고 있지?' 라는 의문이 들 때가 종종 있습니다. 주로 이런 고민은 '지금 내가 이것을 함으로써 미래에 도움이 될까?' 라는 불안감에서 시작되었던 것 같습니다.
한기용님께서는 현재 주어진 것을 열심히 해서 주변 사람들에게 좋은 평판을 얻으면 나중에도 좋은 기회가 생길 것이라고 했습니다.
평판을 생각하지 않더라도 무언가를 열심히 하지 않으면 그것을 통해서 어떤 성장을 할 수 있는지 알 수 없다고 생각합니다. 새로운 지식이나 교훈 등을 배움으로써 성장하게 되는 것인데, 해보지 않고 도움이 되지 않는다고 단정하는 것은 모르는 것을 안다고 하는 것과 같고 이는 모순적이기 때문입니다.
지금까지 잘 해왔다는 것에 자신감이 생겼고, 종종 불안감이 생길 때도 이번에 배운 것을 떠올리며 최선을 다 해야겠다고 다짐했습니다.
쿼리 실행계획은 데이터베이스가 쿼리를 실행할 때 어떤 방식으로 처리할 지 알려주는 좋은 도구입니다. 이를 통해서 쿼리가 의도한 대로 인덱스를 사용하는지, 과도한 리소스를 사용하진 않는지 확인할 수 있습니다.
쿼리 실행 계획은 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 temporary
와 Using filesort
는 성능이 저하 될 수 있는 요소입니다.
Using temporary
는 임시 테이블을 생성해서 쿼리를 수행한 것을 의미하며 성능에 좋지 않은 영향을 줍니다.
만약, 임시 테이블 실행이 디스크수준에서 더욱 성능저하의 원인이 될 수 있습니다.
Using filesort
는 테이블이 인덱스로 정렬되지 않아서 별도로 정렬을 수행한 것을 의미합니다.
마찬가지로 정렬해야 하는 양이 많아서 디스크 I/O 가 발생하게 되면 성능 저하의 원인이 될 수 있습니다.