운영 DB에서 특정 화면이 느리다는 제보를 받으면, 저는 제일 먼저 쿼리부터 봅니다. 그런데 쿼리를 열어보면 십중팔구 이런 반응이 나옵니다. "어? 이거 인덱스 있는데?" 인덱스가 있다는 것과 인덱스를 탄다는 것은 완전히 다른 얘기입니다. 이 차이를 모르면 인덱스를 아무리 추가해도 쿼리는 계속 느립니다.이번 글은 제가 실무에서 반복적으로 만난 "인덱스가 있는데도 안 타는" 케이스들을 MySQL 기준으로 정리한 것입니다. 대부분 EXPLAIN 한 번이면 원인이 보이는 것들인데, 처음 겪으면 한참 헤매게 되는 유형들입니다.사진: Unsplash의 Growtika먼저 EXPLAIN 읽는 법부터, 딱 세 컬럼만실행계획을 처음 보면 컬럼이 많아서 부담스러운데, 실무에서 문제를 잡을 때 제가 먼저 보는 건 딱 세 ..
사용자 테이블에서 휴대폰 번호가 안 들어간 행을 찾으려고 IS NULL을 걸었는데 아무것도 안 나온 적이 있다. 분명 화면에는 비어 보이는데 말이다.원인은 단순했다. 그 컬럼에 들어 있던 건 NULL이 아니라 빈 문자열이었다. IS NULL 같은 문법이 있을 줄 알고 IS EMPTY를 찾았는데, 그런 건 없고 그냥 이렇게 하면 된다.SELECT * FROM users WHERE mobile = '';NULL과 빈 문자열은 완전히 다른 값이다둘 다 "값이 없다"처럼 보이지만 DB 입장에서는 전혀 다르다.NULL: 값이 존재하지 않음. "모른다"에 가깝다.빈 문자열(''): 길이가 0인 문자열이라는 값이 존재한다.그래서 이런 결과가 나온다.SELECT NULL = ''; -- NULL (true..
