경력
CRM/DW 및 SI 프로젝트 수행
네이버 & 라인 DB팀 근무
카카오 DB팀 근무
(현) 당근마켓 인프라실 DB팀 팀장
저서
Real MySQL 8.0 개정판 1권/2권
Real MongoDB
Real MariaDB
Real MySQL
MySQL 성능 최적화
강의
수강평
- Real MySQL 시즌 1 - Part 1
- Real MySQL 시즌 1 - Part 1
게시글
질문&답변
ORDER BY가 필요한 이유
김상형님 안녕하세요. 만약 쿼리가 ix_userid_id 인덱스를 사용한다면, 말씀하신 것처럼 id 컬럼으로 정렬된 결과를 반환할 것이라고 예상할 수 있습니다. 즉 이 경우에는 ORDER BY id 를 명시하지 않아도 정렬 효과를 얻을 수 있는거죠.그런데, 이 쿼리가 ix_userid_id 인덱스를 사용하지 못하는 경우에는, (쿼리에 ORDER BY id 가 명시되지 않았다면) 결과가 id 컬럼 값으로 정렬되지 않을 수도 있어요. 그런데 특정 힌트를 지정하지 않는 이상 실행 계획은 항상 유동적이라고 가정해야 합니다. 그래서 정렬된 결과가 필요하다면, ORDER BY 절을 명시하는 것이 권장됩니다.
- 0
- 2
- 59
질문&답변
Mysql table avg_row_length
안녕하세요. 아래 예제에서와 같이, MySQL 서버의 avg_row_legnth 는 data_length / rows 값의 결과일뿐입니다. 그리고 data_length 값은 테이블의 데이터가 저장된 페이지의 개수 * 페이지크기(16KB) 입니다.마지막으로 데이터가 저장된 페이지의 개수 에는 Off-page 또는 Inline으로 저장된 TEXT/BLOB 컬럼들도 모두 포함됩니다.CREATE TABLE table_stats (id int primary key, fd text); INSERT INTO table_stats VALUES (1, REPEAT('한글',10000)); SELECT id, length(fd) FROM table_stats; +----+------------+ | id | length(fd) | +----+------------+ | 1 | 60000 | +----+------------+ ANALYZE TABLE table_stats; +------------------+---------+----------+----------+ | Table | Op | Msg_type | Msg_text | +------------------+---------+----------+----------+ | matt.table_stats | analyze | status | OK | +------------------+---------+----------+----------+ SHOW TABLE STATUS LIKE 'table_stats' \G *************************** 1. row *************************** Name: table_stats Engine: InnoDB Version: 10 Row_format: Dynamic Rows: 1 Avg_row_length: 81920 Data_length: 81920 Max_data_length: 0 Index_length: 0 Data_free: 0 Auto_increment: NULL Create_time: 2025-02-02 07:06:31 Update_time: 2025-02-02 07:06:59 Check_time: NULL Collation: utf8mb4_0900_ai_ci Checksum: NULL Create_options: Comment: 1 row in set (0.00 sec) 설명이 길었는데, 결론은 TEXT/LONGTEXT 타입 컬럼도 모두 avg_row_length 에 영향을 미치게 됩니다.
- 0
- 1
- 68
질문&답변
Real MySQL 시즌1 part 2 에피소드 16의 인덱스가 null인 컬럼을 포함한다는 것에 대한 질문
안녕하세요. NULL이 저장될 수 있는 컬럼에 인덱스가 있다 하더라도, MySQL 서버의 인덱스는 (Oracle DBMS와 는 다르게) NULL 값을 인덱스에 포함하기 때문에, 인덱스만 읽어도 정확한 레코드 건수를 확인할 수 있다는 의미입니다. 감사합니다.
- 0
- 1
- 77
질문&답변
1강. delete marking된 데이터의 정리 주기는 어느 정도인가요?
안녕하세요. PostgreSQL 서버와는 달리, MySQL 서버는 데이터 페이지 공간이 부족해지는 시점에 페이지 단위로 Record Reorganize 작업을 하게 됩니다. 그래서 이 작업을 명시적으로 실행할 수 있는 방법은 optimize table 명령밖에 없는데,,, 이 작업을 굳이 명시적으로 하실 필요는 그렇게 많지 않습니다. 감사합니다.
- 0
- 2
- 116
질문&답변
MySQL Where절 내 조건의 순서
안녕하세요. 실제 실행 계획을 수립하는데 있어서는, WHERE 조건절에 나열된 조건의 순서는 영향을 미치지 않습니다.쿼리의 성능과 100% 무관하다고 말씀드리긴 어렵지만, MySQL 서버를 공부하시는 수준에서는 영향이 없다고 알고 계셔도 무리는 없어 보입니다. 감사합니다.
- 0
- 2
- 137
질문&답변
unique index가 걸린 상황에서 s-lock, x-lock 질문
안녕하세요 unique index는 s-lock을 꼭 필요로 한다면,delete가 선행되지 않는 상황에서도 deadlock이 발생해야되는거 아닌가? 싶습니다.넵, 맞습니다. 이 예제에서 첫번째 트랜잭션이 DELETE를 실행하는 건, 두번째와 세번째 트랜잭션이 동시에 시작되면서 두번째와 세번째 트랜잭션이 시점이 딱 맞아 떨어지도록 해주는 트리거 역할을 해주는 것입니다. 그래서 실제 Deadlock은 첫번째 트랜잭션에서 COMMIT을 실행하는 시점에 발생하게 되는 것입니다. 감사합니다.
- 0
- 2
- 297
질문&답변
ep11) Prepared Statement에서 질문
도현님, 안녕하세요. Client side preparedstatement에서도, 바이딩되는 값에 대해서 따옴표나 특수 문자들에 대해서 필요한경우, 자동으로 Escape 처리를 해주기 때문에 SQL Injection을 막을 수 있다는 의미입니다. 감사합니다.
- 0
- 2
- 79
질문&답변
12강 FULL GROUP BY
조혜륜님, 안녕하세요.GROUP BY 절에 명시되지 않은 컬럼에 대해서 집합 함수(Aggregation func)을 사용하면 FULL-GROUPBY 규칙에 위배되지 않습니다. 그래서 ppt에서 SUM 함수를 사용했기 때문에, 이는 문법상 문제 없는 쿼리가 되는 것입니다. 감사합니다.
- 0
- 2
- 67
질문&답변
7)select for update 강의에서 질문
도현님 안녕하세요. 넵, AI가 알려준 내용은 잘못된 것입니다. 격리 수준에 관계없이 트랜잭션내에서 FOR UPDATE로 잠겨진 레코드는 트랜잭션이 완료되어야 잠금 해제됩니다. 감사합니다.
- 0
- 2
- 130
질문&답변
deternmistic 질문
안녕하세요.결론적으로 , 모든 함수를 전부 deterministic 으로 명시를 해줄경우 단점이 무엇인가요??함수가 NOT-DETERMISTIC이어야 하는 경우가 있지 않을까 싶긴 한데요. 왠만한 서비스 요건에서는 이런 경우를 거의 보지 못했었어요. 그래서 서비스별로 요건을 검토해서 NOT-DETERMINISTIC일 필요가 없다면, 반드시 Stored Function에 DETERMINISTIC 키워드를 명시해서 사용하는 방법을 권장드린 것입니다.이건 서비스의 특성에 따른 요건이기 때문에, 단정적으로 모두 DETERMINISTIC으로 정의해서 사용해도 된다고 제가 말씀드리긴 어려운 부분인 듯 합니다. 감사합니다.
- 0
- 2
- 107