Kacam.net

データベース

联合索引的顺序

(user_id, status) 这个索引,单查 status 为什么用不上?

プロンプトをコピーして、どれか一つを選んでください。答えを並べるのではなく、面接官として場面ごとに問い詰めてきます。

アプリを入れたスマートフォンなら、そのままアプリが開きます。WeChat の中では外部アプリを開けないので、先にブラウザで開いてください。

コピーした文章の末尾には採点用の答えが付いています。自分で先に読まないこと —— 自分で導き出せたかどうかが肝心です。

这一份是整个系列的地基:说不清叶子节点上是什么顺序的人,后面几份里「锁加在索引上」「扫描行数为什么这么大」都会跟着糊。

它不会给你「最左前缀」这四个字。它会让你先把六条记录按索引里的顺序抄一遍,然后一条条问哪些查询用得上 —— 你自己抄过那一串,规则就不用背了。

第三幕最值钱:索引是 (user_id, created_at, status),查询三个条件都写了 —— 有几列是真的用来定位的? 多数人第一次都答「三列」。

★★★☆☆ · 約 35 分 · 問われるのは:叶子上的字典序、最左前缀、范围列之后、排序能不能免掉

この一つで鍛えるもの

インデックス構造 効く/効かない

この問題はやったか

ログインすると「この問題はやった」を記録できます。次に来たとき、いつやったか分かります。

やった人の手記

まだ誰も書いていません。やり終えたら、そのやり取りで何が出てきたか書いてください —— どの場面で詰まったか、あとで変えた結論はどれか。

ログインすると手記を書けます。

使い方

これは学習型です:導いてくれますが、答えられなくなるまで追い詰めることはしません。詰まったらまずどの層で詰まっているか(聞いたことがない / 知っているが理由が分からない / 分かるが使えない)を訊いてから、何を渡すか決めます。同じ点で二回導いても通じないときだけ直接説明し、そのあと自分の言葉で言い直させます。

既定では MySQL / InnoDB で話します —— この分野の落とし穴は半分が実装の詳細で、クラスタインデックス・二次索引からの再検索・ギャップロックは他では事情が違います。PostgreSQL などでも構いません。最初の一言でどれを使っているか言えば、それに合わせて話し、結論が変わるところを指摘してくれます。

始め方

  1. 一つ選び、開いて、プロンプトをコピーします。
  2. 新しい空のチャットに貼り、最初にどの製品のどのバージョンかを言います(言わなければ MySQL 8 として扱われます)。
  3. あとは何も言わず、最初の質問を待ちます。

途中でいつでも使える四つの合言葉

  • 跳过 すぐ次の幕へ
  • 换个说法 ここを別の角度で言い直して
  • 直说吧 完全な答えを言って、そのあと復唱させて
  • 复盘 すぐ締めのカードへ

三つの落とし穴

  • 末尾の底牌を先に読まないこと —— あの「よくある思い違い」の欄が、各問の答えそのものです。
  • 数字を求められる覚悟を。「少し速くなる」「IO が減る」はその場で遮られます:何行?何回?何倍? 数字の出ない結論は暗記です。
  • 褒め始めたら「褒めるな」の条を指摘してください。導くことと甘やかすことは別です。

まず複合インデックスの回から。ここの土台で、「ロックはインデックスの記録に付く」「なぜこんなに行を読むのか」はどちらもその一文に寄りかかっています。本番で並行性に噛まれているなら「読んでから書く」、クエリが遅いなら実行計画の回から。