テクノロジー

deleted_atにインデックスを雑に貼ったら本番DBが死んだ

1: Sampo 2026/04/18 02:17

stagingでEXPLAINまで確認しておいてこうなっちゃうのはもう不慮の事故としか言いようがないすね(インデックスショットガンへの反省という文脈とはいえ、狙いすましたインデックスでも起こり得る事故)

2: chikurou 2026/04/18 02:57

"「少しでも改善してくれれば」という気持ちで追加しました。遅いクエリに対して効くかもしれないインデックスを広めに貼る"ここがまさに事故の元

3: t_f_m 2026/04/18 03:32

"根っこにあるのはMySQL 8.0 innodb_stats_methodのデフォルト値nulls_equalと、IS NULLに対するコスト計算の噛み合わせです。8.0系で現在も未修正のバグに類する挙動で、NULL多数カラムへの単独インデックスがトリガーになります"

4: dominion525 2026/04/18 04:52

とにかくインデックスを張れば何とか、みたいな根拠の薄い願望が原因だと思うのでいろいろよろしくない。お疲れさまでした。

5: InoHiro 2026/04/18 05:35

MySQL が Null を全て同一の値として扱うところ、PostgreSQL ではどうだろう

6: clairvy 2026/04/18 05:47

わからんけど、なんでインデックス貼ったんだ?値が偏ることは自明だとしたら、有効的でないような?

7: daaaaaai 2026/04/18 05:55

ありそう。。

8: Guro 2026/04/18 06:38

こういうの辛いな

9: taruhachi 2026/04/18 06:55

MySQLでは単一のテーブル毎にひとつしかインデックスが使えないので、ほぼ全てのクエリで利用される癖にカーディナリティーの低い絞り込みにほとんど寄与しない単独インデックスを貼っておく事そのものがリスク

10: nguyen-oi 2026/04/18 07:05

IS NULLの統計トラップ怖すぎ。EXPLAINが嘘をつく世界線は嫌だw

11: wazpk6no 2026/04/18 07:38

最近MYSQL使わないから同じこと起きそうで怖え。要注意

12: hasiduki 2026/04/18 07:42

こわーーーーーー!!!ー!ー!

13: Iridium 2026/04/18 07:55

いつも思うけど、DBが勝手に最適なやり方を推論すること自体がかなり危うい仕様だと思うんだけど。実行計画も人間が書けるべきで、アーキテクチャが間違っている。DB作れないかなー

14: tofu-kun 2026/04/18 07:59

インデックスどれが最適かDBが選ぶのは本番環境だけ事故る要因の一つだと思う。とはいえ、まいかいインデックス指定するのもどうかと思うが…。

15: taguch1 2026/04/18 08:59

正常なデータがnullのものにインデックス貼ることはしないけど新人が手順だけ模倣して作業することを考えるならインデックスのレビューには本番データのカーディナリティを調べてつけるようにする。あと論理削除(ry

16: khtno73 2026/04/18 09:30

Oracle勢のSIerエンジニアは単一列のインデックスはNull見てくんない地雷だいたいみんな踏んでるから、そもそも複合インデックスにするか、削除済みは別テーブルに逃す設計にしそうな

17: pekee-nuee-nuee 2026/04/18 09:35

これはやりそう。いろんな罠があるな……

18: kmaebashi 2026/04/18 10:02

インデックスって貼るものだったのか? 張るものだと思ってた。

19: glass-_-onion 2026/04/18 10:05

PostgresSQLならINDEX idx_tickets(workspace_id) WHERE deleted_at IS NOT NULL と設定できるんだけどmysql辛いな。

20: peketamin 2026/04/18 10:30

実行計画への介入ができる仕組みがあるといいよね

21: t-murachi 2026/04/18 10:55

MySQLはリスク(´・ω・`)

22: shunt_i 2026/04/18 13:19

NULL多数カラム(deleted_at等)に単独INDEXを貼らない。nulls_equal統計でIS NULLのrows推定が1件に歪み、単独INDEXが最安と誤判定され全走査化。複合INDEXの後続に置く。stagingのEXPLAINは統計サンプリング次第で本番と逆転しうる。

23: sue445 2026/04/18 14:04

解説パートがよかった

24: dkfj 2026/04/18 15:15

フラグにはビットマップインデックスじゃないの、でも効果少ないからなぁと思ったら、まったく別の話だった。人生の中で3か月くらい、ひたすらSQLとインデックスを調べていた時代があったので、いつか語ってみたい

25: proverb 2026/04/18 15:20

めっちゃあり得るユースケースだな

26: s17er 2026/04/18 17:42

自分もハマりそう… ステージングのデータをどう保つべきかみたいな話にもなるのかな

27: andalusia 2026/04/18 20:38

やはり postgres・・・postgres はすべてを解決する!(複数の単独インデックスを同時に使えるし、soft delete パターンに対しては部分インデックスも使えるし)

28: ys0000 2026/04/18 20:48

本文ちゃんと読んでないけど、カバリンクインデックスを複数張れないの?中々設計がシビアね。