Kacam.net

세상을 보다

데이터베이스: 한 번에 한 조각

「인덱스 최적화 / 트랜잭션 / 튜닝」식으로 자르지 않습니다 —— 그렇게 자르면 정답지가 「선택도를 보라, 락을 보라」밖에 안 됩니다. 여기서 자른 것은 복합 인덱스의 컬럼 순서, UPDATE 한 줄이 실제로 잠근 것, OFFSET이 그 한 단계에서 하는 일입니다.

이 프롬프트 모음은 지금은 简体中文만 있습니다.

사용법

이 시리즈는 학습형입니다: 몰아붙이지 않고 이끌어 줍니다. 막히면 먼저 어느 층에서 막혔는지(들어본 적 없다 / 알지만 이유를 모른다 / 알지만 못 쓴다) 묻고 나서 무엇을 줄지 정합니다. 같은 지점에서 두 번 이끌어도 안 통할 때만 직접 설명하고, 설명한 뒤에는 당신 말로 다시 말하게 합니다.

기본은 MySQL / InnoDB 기준입니다 —— 이 분야의 함정은 절반이 구현 세부사항이라, 클러스터형 인덱스·리프에서 다시 찾아오기·갭 락은 다른 제품에서 다르게 동작합니다. PostgreSQL 등도 괜찮습니다. 첫 문장에서 무엇을 쓰는지 말하면 그쪽 기준으로 설명하고 결론이 달라지는 지점을 짚어 줍니다.

시작하는 법

  1. 하나 골라서 열고, 프롬프트를 복사합니다.
  2. 새 빈 대화에 붙여 넣고, 첫 문장에서 어떤 제품 어떤 버전인지 말합니다(말하지 않으면 MySQL 8로 봅니다).
  3. 그다음에는 아무 말 없이 첫 질문을 기다립니다.

도중에 언제든 외칠 수 있는 네 가지

  • 跳过 바로 다음 장면으로
  • 换个说法 이 부분을 다른 각도로 다시
  • 直说吧 완전한 답을 말하고, 그다음 내게 복창시키기
  • 复盘 바로 마무리 카드로

세 가지 함정

  • 끝에 있는 정답지를 먼저 읽지 마세요 —— 「흔히 잘못 아는 것」 항목이 곧 매 질문의 답입니다.
  • 숫자를 요구받을 각오를 하세요. 「좀 빨라진다」「IO를 아낀다」는 즉시 끊깁니다: 몇 행? 몇 번? 몇 배? 숫자 없는 결론은 외운 것입니다.
  • 칭찬을 시작하면 「칭찬하지 말라」 조항을 상기시키세요. 이끄는 것과 달래는 것은 다릅니다.

복합 인덱스부터 하세요. 이 시리즈의 토대라서 「락은 인덱스 레코드에 걸린다」「왜 이렇게 많은 행을 읽나」가 모두 그 한 문장에 기댑니다. 운영에서 동시성에 물리고 있다면 「읽고 나서 고치기」부터, 쿼리가 느리면 실행 계획부터.

인덱스

联合索引的顺序
(user_id, status) 这个索引,单查 status 为什么用不上?
★★★☆☆ · 약 35분
它为什么没走索引
索引明明建了,它就是不走 —— 是写废了,还是它算过了?
★★★★☆ · 약 35분
一次查询读了几棵树
一次查询到底读了几棵树、回表几次?
★★★☆☆ · 약 30분

트랜잭션과 락

隔离级别各挡住了什么
RR 下读到余额 100,然后 UPDATE balance = balance - 10 —— 扣完是多少?
★★★★☆ · 약 40분
一条 UPDATE 锁了什么
UPDATE ... WHERE 一个没索引的列 —— 这时候「行锁」还是行锁吗?
★★★★☆ · 약 35분
先查再改,为什么会丢
「包进事务里不就行了」——事务到底挡住了什么?
★★★☆☆ · 약 30분

쿼리와 규모

读了多少行才吐出这几行
看了执行计划,走索引了 —— 那它扫了多少行、返回几行?
★★★☆☆ · 약 35분
翻到第 5000 页
LIMIT 20 OFFSET 100000 —— 它是怎么找到第 100001 行的?
★★★☆☆ · 약 30분
이 프롬프트들은 오픈 소스입니다 본문은 공개 저장소 kacam-net/hero-prompts에서 관리합니다. 어느 하나가 충분히 몰아붙이지 못한다거나 정답 패에 한 줄이 빠졌다면 고치러 오세요 —— 사이트에 올릴지는 별개의 판단이고, 이쪽 목록이 정합니다.