翻到第 5000 页
LIMIT 20 OFFSET 100000 —— 它是怎么找到第 100001 行的?
프롬프트를 복사한 뒤 한 곳을 고르세요. 답을 늘어놓는 대신 면접관이 되어 장면마다 캐묻습니다.
앱이 설치된 휴대폰이면 시스템이 바로 앱을 엽니다. 위챗 안에서는 외부 앱을 열 수 없으니 먼저 브라우저로 여세요.
복사한 글 끝에는 채점용 정답이 붙어 있습니다. 먼저 읽지 마세요 —— 스스로 끌어내 봤는지가 핵심입니다.
答案朴素得让人不舒服:一条条数过去。知道这一句之后,「为什么加了索引还是慢」「为什么第一页快最后一页慢」就都不用问了。
但这一份的一半重量在另一边:换成游标分页之后你放弃了什么。跳页没了、总页数没了、收藏的「第 37 页」也没了 —— 说不出这几条的,只是抄了一个方案。收尾时它会把「只说了技术代价」的地方单独标出来。
最后还问一句很少有人问的:到底是谁在翻第 5000 页?
이 문제가 연습시키는 것
이 본문을 저장소에서 보기 (그 파일 끝이 정답 패입니다. 열면 보입니다)
이 문제 해봤나
로그인하면 이 문제를 해봤다고 기록할 수 있습니다. 다음에 오면 언제 했는지 보입니다.
해본 사람들의 기록
사용법
이 시리즈는 학습형입니다: 몰아붙이지 않고 이끌어 줍니다. 막히면 먼저 어느 층에서 막혔는지(들어본 적 없다 / 알지만 이유를 모른다 / 알지만 못 쓴다) 묻고 나서 무엇을 줄지 정합니다. 같은 지점에서 두 번 이끌어도 안 통할 때만 직접 설명하고, 설명한 뒤에는 당신 말로 다시 말하게 합니다.
기본은 MySQL / InnoDB 기준입니다 —— 이 분야의 함정은 절반이 구현 세부사항이라, 클러스터형 인덱스·리프에서 다시 찾아오기·갭 락은 다른 제품에서 다르게 동작합니다. PostgreSQL 등도 괜찮습니다. 첫 문장에서 무엇을 쓰는지 말하면 그쪽 기준으로 설명하고 결론이 달라지는 지점을 짚어 줍니다.
시작하는 법
- 하나 골라서 열고, 프롬프트를 복사합니다.
- 새 빈 대화에 붙여 넣고, 첫 문장에서 어떤 제품 어떤 버전인지 말합니다(말하지 않으면 MySQL 8로 봅니다).
- 그다음에는 아무 말 없이 첫 질문을 기다립니다.
도중에 언제든 외칠 수 있는 네 가지
跳过바로 다음 장면으로换个说法이 부분을 다른 각도로 다시直说吧완전한 답을 말하고, 그다음 내게 복창시키기复盘바로 마무리 카드로
세 가지 함정
- 끝에 있는 정답지를 먼저 읽지 마세요 —— 「흔히 잘못 아는 것」 항목이 곧 매 질문의 답입니다.
- 숫자를 요구받을 각오를 하세요. 「좀 빨라진다」「IO를 아낀다」는 즉시 끊깁니다: 몇 행? 몇 번? 몇 배? 숫자 없는 결론은 외운 것입니다.
- 칭찬을 시작하면 「칭찬하지 말라」 조항을 상기시키세요. 이끄는 것과 달래는 것은 다릅니다.
복합 인덱스부터 하세요. 이 시리즈의 토대라서 「락은 인덱스 레코드에 걸린다」「왜 이렇게 많은 행을 읽나」가 모두 그 한 문장에 기댑니다. 운영에서 동시성에 물리고 있다면 「읽고 나서 고치기」부터, 쿼리가 느리면 실행 계획부터.
로그인 후에 기록을 남길 수 있습니다.