Kacam.net

데이터베이스

读了多少行才吐出这几行

看了执行计划,走索引了 —— 那它扫了多少行、返回几行?

프롬프트를 복사한 뒤 한 곳을 고르세요. 답을 늘어놓는 대신 면접관이 되어 장면마다 캐묻습니다.

앱이 설치된 휴대폰이면 시스템이 바로 앱을 엽니다. 위챗 안에서는 외부 앱을 열 수 없으니 먼저 브라우저로 여세요.

복사한 글 끝에는 채점용 정답이 붙어 있습니다. 먼저 읽지 마세요 —— 스스로 끌어내 봤는지가 핵심입니다.

这一份不教你背 type 那一串从好到坏的顺序,它只逼一个比值:扫描行数 ÷ 返回行数。这个数说明的问题比耗时多得多。

中间会给你一份真实的计划让你逐字段解释,其中有一问几乎人人第一次都答错:都有 LIMIT 20 了,为什么还要排四万多行?

最后一幕问计划之外的事:执行计划完美但查询还是慢,能是什么。

★★★☆☆ · 약 35분 · 무엇을 보는가: 扫描行数与返回行数、rows 是估算、排序和临时表的代价、计划之外的慢

이 문제가 연습시키는 것

실행 계획 타느냐 못 타느냐

이 문제 해봤나

로그인하면 이 문제를 해봤다고 기록할 수 있습니다. 다음에 오면 언제 했는지 보입니다.

해본 사람들의 기록

아직 아무도 쓰지 않았습니다. 해본 뒤에 무엇이 나왔는지 적어 주세요 — 어느 장면에서 막혔는지, 나중에 바꾼 결론은 무엇인지.

로그인 후에 기록을 남길 수 있습니다.

사용법

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

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

시작하는 법

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

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

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

세 가지 함정

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

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