它为什么没走索引
索引明明建了,它就是不走 —— 是写废了,还是它算过了?
プロンプトをコピーして、どれか一つを選んでください。答えを並べるのではなく、面接官として場面ごとに問い詰めてきます。
アプリを入れたスマートフォンなら、そのままアプリが開きます。WeChat の中では外部アプリを開けないので、先にブラウザで開いてください。
コピーした文章の末尾には採点用の答えが付いています。自分で先に読まないこと —— 自分で導き出せたかどうかが肝心です。
「索引失效的十种情况」那种清单背完就忘,因为它没告诉你共同点。这一份要你自己说出那个共同点,然后拿它去判每一条具体的 SQL。
但真正的重点在第三幕:有一类「没走索引」是优化器算过之后的正确选择。分不开这两类,你会一路奔着「加个 hint 强制走索引」去 —— 而它会追你一句:你怎么知道走索引真的更快?拿什么数证明?
最后一幕反过来问:有没有可能走了索引比全表扫还慢。
この一つで鍛えるもの
この本文をリポジトリで見る (ファイルの末尾が手の内です。開けば目に入ります)
この問題はやったか
ログインすると「この問題はやった」を記録できます。次に来たとき、いつやったか分かります。
やった人の手記
使い方
これは学習型です:導いてくれますが、答えられなくなるまで追い詰めることはしません。詰まったらまずどの層で詰まっているか(聞いたことがない / 知っているが理由が分からない / 分かるが使えない)を訊いてから、何を渡すか決めます。同じ点で二回導いても通じないときだけ直接説明し、そのあと自分の言葉で言い直させます。
既定では MySQL / InnoDB で話します —— この分野の落とし穴は半分が実装の詳細で、クラスタインデックス・二次索引からの再検索・ギャップロックは他では事情が違います。PostgreSQL などでも構いません。最初の一言でどれを使っているか言えば、それに合わせて話し、結論が変わるところを指摘してくれます。
始め方
- 一つ選び、開いて、プロンプトをコピーします。
- 新しい空のチャットに貼り、最初にどの製品のどのバージョンかを言います(言わなければ MySQL 8 として扱われます)。
- あとは何も言わず、最初の質問を待ちます。
途中でいつでも使える四つの合言葉
跳过すぐ次の幕へ换个说法ここを別の角度で言い直して直说吧完全な答えを言って、そのあと復唱させて复盘すぐ締めのカードへ
三つの落とし穴
- 末尾の底牌を先に読まないこと —— あの「よくある思い違い」の欄が、各問の答えそのものです。
- 数字を求められる覚悟を。「少し速くなる」「IO が減る」はその場で遮られます:何行?何回?何倍? 数字の出ない結論は暗記です。
- 褒め始めたら「褒めるな」の条を指摘してください。導くことと甘やかすことは別です。
まず複合インデックスの回から。ここの土台で、「ロックはインデックスの記録に付く」「なぜこんなに行を読むのか」はどちらもその一文に寄りかかっています。本番で並行性に噛まれているなら「読んでから書く」、クエリが遅いなら実行計画の回から。
ログインすると手記を書けます。