ど素人から毛を生やす。<延>

[MySQL]Incorrect key file for tableは処理落ちでも発生する

Web > Other 2018年2月14日(最終更新:6年前)

2018年2月14日に作成されたページです。
情報が古かったり、僕が今以上のど素人だった頃の記事だったりする可能性があります。

どもです。
MySQL初心者、やらかしました。

Incorrect key file for table '/tmp/#sql_******'; try to repair it

開発では問題なかったのに、テストアップしたらこんな感じのエラーに遭遇しまして。
このエラーについて調べてみると、
DBが壊れている
tmp領域に空きが無い
この2件が出てきたのですが、原因はもっと間抜けなものだったという戒めの備忘録です。

やりたかったのは、こんな感じ。


親
+-------+------------------------+
| ID    | 条件Aに一致する子番号    |
+-------+------------------------+
|    1  |                     2  |
|    2  |                     1  |
|    3  |                     3  |
|    4  |                     2  |
+-------+------------------------+

子
+-------+-------+--------+
| 親ID  | 枝番  | セット  |
+-------+-------+--------+
|    1  |    1  |     1  |
|    1  |    2  |     2  |
+-------+-------+--------+
|    2  |    1  |     1  |
|    2  |    2  |     1  |
+-------+-------+--------+
|    3  |    1  |     1  |
|    3  |    2  |     1  |
|    3  |    3  |     2  |
+-------+-------+--------+
|    4  |    1  |     1  |
|    4  |    2  |     2  |
|    4  |    1  |     3  |
+-------+-------+--------+

1つの親に対して複数の子があるテーブルで、
親の方に「特定の条件に合致する一つの子の枝番」を記録しています。

で、子のデータを取得するときに、
自分が「特定の条件に合致する枝番が含まれたセットかどうか」を判断したい。

ので、
①子から親に「ID」でJOIN。
②JOINした親から子に「条件Aに一致する子番号」と「枝番」でJOIN。
③JOINした、「条件Aに一致する子番号の子」データから、セット番号を取得。
としました。

で、このFROM部が、こうなるわけです。


FROM 子
 LEFT JOIN 親 ON 子.親ID = 親.ID
 LEFT JOIN 子 AS 子α ON 親.条件Aに一致する子番号 = 子α.枝番

うん、日本語で書くと何がおかしいか、一目でわかるものですね。
こらあかんわ。

この記述だと上記テーブルの場合、[親ID-枝番]として、
[1-1]に対して枝番=2の分、つまり[1-2][2-2][3-2][4-2]の4件がHitしてしまい、
その結果、[1-1]が4行できてしまいます。

開発環境はデータ数が少ないのでこの程度ですが、これが仮に1万件のデータが入っていた場合…
単純計算で子1件につき1万件の行が作成されるわけで…

そりゃ、処理落ちしますな! 当然ですな!

見たことのないエラーだったので原因がピンと来なく、原因特定が遅れてしまいました。
Incorrect key file for table は処理落ちでも発生しうる。僕、覚えた。

ちなみに本件の正解FROMは、こう。


FROM 子
 LEFT JOIN 親 ON 子.親ID = 親.ID
 LEFT JOIN 子 AS 子α ON 親.条件Aに一致する子番号 = 子α.枝番 AND 親.ID = 子α.親ID

JOINでANDを使うの、つい忘れるんだよなぁ。気をつけねば。

この記事は役に立ちましたか?
  • _(:3」∠)_ 面白かった (0)
  • (・∀・) 参考になった (0)
  • (`・ω・´) 役に立った (0)