#MySQL

8개의 글
개발

8초가 0.05초가 되는 순간 — MySQL 인덱스, 왜 걸어도 안 먹히나

회원 3천 명일 때는 아무 문제 없던 목록 페이지가, 회원이 30만 명이 되자 갑자기 8초씩 걸리기 시작한다. 서버 사양을 올려도 잠깐 나아질 뿐이다. 이런 상황의 원인은 대개 하나다. 인덱스가 없거나, 있어도 데이터베이스가 그 인덱스를 못 쓰고 있다. 인덱스는 어렵고 신비한 기술이 아니다. 책 뒤에 붙은 '찾아보기'와 정확히 같은 물건이다. 오늘은 그 찾...

2026.08.26 · 읽기 7분 · 조회 490
8초가 0.05초가 되는 순간 — MySQL 인덱스, 왜 걸어도 안 먹히나
개발

표 두 개가 만나야 답이 나온다 — SQL JOIN, 헷갈리는 4가지를 한 번에 정리

회원 목록과 주문 목록이 각각 다른 표에 흩어져 있다고 해보자. "이번 달에 주문한 사람의 이름을 뽑아줘"라는 부탁을 받는 순간, 우리는 두 표를 어떤 식으로든 이어 붙여야 한다. 이 '이어 붙이기'가 바로 JOIN이다. 개념은 단순한데, 막상 실무에서 결과 행이 이상하게 부풀거나 빠지면 그때부터 머리가 아파진다. 대부분은 JOIN의 종류를 정확히 구분하지...

2026.07.30 · 읽기 3분 · 조회 1,245
표 두 개가 만나야 답이 나온다 — SQL JOIN, 헷갈리는 4가지를 한 번에 정리
개발

PHP 시간이 9시간 어긋날 때 — 시간대(timezone) 제대로 잡기

"분명 방금 글을 올렸는데 작성 시간이 9시간 전으로 찍혀요." PHP로 웹을 만들다 보면 한 번쯤 마주치는 황당한 버그다. 기능은 멀쩡한데 시간만 어긋난다. 범인은 십중팔구 ==시간대(timezone)== 설정이다. 오늘은 PHP와 MySQL 사이에서 시간이 꼬이는 이유와, 깔끔하게 맞추는 방법을 실무 관점에서 정리한다. 왜 9시간이 어긋날까 PHP의 기...

2026.06.30 · 읽기 1분 · 조회 1,039
PHP 시간이 9시간 어긋날 때 — 시간대(timezone) 제대로 잡기
개발

MySQL 'Lock wait timeout' 에러, 서버 재시작 말고 범인부터 찾자

금요일 저녁, 정산 배치가 돌아가는 시간이었다. 평소엔 1분이면 끝나던 작업이 멈춰 있었고, 화면에는 낯익은 한 줄이 떠 있었다. `Lock wait timeout exceeded; try restarting transaction`. 누군가는 이 메시지를 보면 일단 서버부터 재시작하고 보지만, 그건 대개 문제를 미루는 일일 뿐이다. 오늘은 이 에러가 왜 생...

2026.06.29 · 읽기 6분 · 조회 1,093
MySQL 'Lock wait timeout' 에러, 서버 재시작 말고 범인부터 찾자
개발

한글이 ???로 깨졌다면 — MySQL utf8mb4, 진짜 원인은 따로 있다

분명히 잘 들어가던 한글 데이터가 어느 날 갑자기 `???`나 `한글` 같은 외계어로 바뀌어 보인 적 있으신가요. 게시판에 글을 쓰면 멀쩡한데, 터미널에서 덤프를 떴다가 다시 넣으면 죄다 깨지는 상황. 많은 개발자가 여기서 "테이블 문자셋을 utf8로 바꿨는데 왜 안 되지?"라며 몇 시간을 날립니다. > 한글 깨짐의 90%는 파일이 잘못된 게 아니라...

2026.06.25 · 읽기 6분 · 조회 774
한글이 ???로 깨졌다면 — MySQL utf8mb4, 진짜 원인은 따로 있다
개발

화면이 갑자기 느려졌다면 — EXPLAIN으로 MySQL 인덱스 문제 잡기

목록 페이지가 갑자기 느려진 적 있으신가요? 어제까지 멀쩡하던 화면이 오늘따라 빙글빙글 돌기만 합니다. 코드는 하나도 안 바꿨는데 말이죠. 저도 처음 이 상황을 겪었을 때 서버를 의심하고, 네트워크를 의심하고, 심지어 컴퓨터를 한 번 껐다 켰습니다. 범인은 엉뚱한 곳에 있었습니다. 데이터가 쌓이면서 인덱스 없는 쿼리가 테이블 전체를 훑기 시작한 것이죠. 오...

2026.06.24 · 읽기 8분 · 조회 1,460
화면이 갑자기 느려졌다면 — EXPLAIN으로 MySQL 인덱스 문제 잡기
개발

PHP mysqli, 문자열 이어붙이기 대신 prepared statement로 SQL 인젝션 막기

사용자 입력을 SQL에 직접 이어붙이면 SQL 인젝션에 노출된다. 결론부터 말하면 mysqli의 prepared statement(준비된 쿼리) 를 쓰면 값과 쿼리 구문이 분리되어 대부분의 인젝션을 원천 차단할 수 있다. 위험한 코드 ```php // 절대 이렇게 쓰지 말 것 $id = $_GET['id']; $sql = "SELECT FROM member...

2026.06.24 · 읽기 2분 · 조회 1,506
PHP mysqli, 문자열 이어붙이기 대신 prepared statement로 SQL 인젝션 막기
개발

MySQL 한글 깨짐, utf8mb4로 해결하는 순서 (PHP/임포트 포함)

MySQL에 한글을 저장했는데 글자가 `???` 나 깨진 문자로 보인 적 있으신가요? 원인은 대부분 문자셋(charset) 불일치입니다. 한 군데만 어긋나도 깨집니다. 이 글에서 어디를 맞춰야 하는지 순서대로 정리합니다. 결론부터: utf8 말고 utf8mb4 MySQL의 `utf8`은 사실 최대 3바이트만 저장하는 반쪽짜리라 이모지·일부 한자에서 문제가 ...

2026.06.23 · 읽기 3분 · 조회 1,289
MySQL 한글 깨짐, utf8mb4로 해결하는 순서 (PHP/임포트 포함)
AD