세상을 보다
데이터베이스: 한 번에 한 조각
「인덱스 최적화 / 트랜잭션 / 튜닝」식으로 자르지 않습니다 —— 그렇게 자르면 정답지가 「선택도를 보라, 락을 보라」밖에 안 됩니다. 여기서 자른 것은 복합 인덱스의 컬럼 순서, UPDATE 한 줄이 실제로 잠근 것, OFFSET이 그 한 단계에서 하는 일입니다.
이 프롬프트 모음은 지금은 简体中文만 있습니다.
사용법
이 시리즈는 학습형입니다: 몰아붙이지 않고 이끌어 줍니다. 막히면 먼저 어느 층에서 막혔는지(들어본 적 없다 / 알지만 이유를 모른다 / 알지만 못 쓴다) 묻고 나서 무엇을 줄지 정합니다. 같은 지점에서 두 번 이끌어도 안 통할 때만 직접 설명하고, 설명한 뒤에는 당신 말로 다시 말하게 합니다.
기본은 MySQL / InnoDB 기준입니다 —— 이 분야의 함정은 절반이 구현 세부사항이라, 클러스터형 인덱스·리프에서 다시 찾아오기·갭 락은 다른 제품에서 다르게 동작합니다. PostgreSQL 등도 괜찮습니다. 첫 문장에서 무엇을 쓰는지 말하면 그쪽 기준으로 설명하고 결론이 달라지는 지점을 짚어 줍니다.
시작하는 법
- 하나 골라서 열고, 프롬프트를 복사합니다.
- 새 빈 대화에 붙여 넣고, 첫 문장에서 어떤 제품 어떤 버전인지 말합니다(말하지 않으면 MySQL 8로 봅니다).
- 그다음에는 아무 말 없이 첫 질문을 기다립니다.
도중에 언제든 외칠 수 있는 네 가지
跳过바로 다음 장면으로换个说法이 부분을 다른 각도로 다시直说吧완전한 답을 말하고, 그다음 내게 복창시키기复盘바로 마무리 카드로
세 가지 함정
- 끝에 있는 정답지를 먼저 읽지 마세요 —— 「흔히 잘못 아는 것」 항목이 곧 매 질문의 답입니다.
- 숫자를 요구받을 각오를 하세요. 「좀 빨라진다」「IO를 아낀다」는 즉시 끊깁니다: 몇 행? 몇 번? 몇 배? 숫자 없는 결론은 외운 것입니다.
- 칭찬을 시작하면 「칭찬하지 말라」 조항을 상기시키세요. 이끄는 것과 달래는 것은 다릅니다.
복합 인덱스부터 하세요. 이 시리즈의 토대라서 「락은 인덱스 레코드에 걸린다」「왜 이렇게 많은 행을 읽나」가 모두 그 한 문장에 기댑니다. 운영에서 동시성에 물리고 있다면 「읽고 나서 고치기」부터, 쿼리가 느리면 실행 계획부터.
트랜잭션과 락
隔离级别各挡住了什么
RR 下读到余额 100,然后 UPDATE balance = balance - 10 —— 扣完是多少?
一条 UPDATE 锁了什么
UPDATE ... WHERE 一个没索引的列 —— 这时候「行锁」还是行锁吗?
先查再改,为什么会丢
「包进事务里不就行了」——事务到底挡住了什么?