勉強したことのメモ

webプログラマ見習いが勉強したことのメモ。

InnoDBのオートインクリメント

      2016/07/01

MySQLのInnoDBでIDというカラムにオートインクリメント設定していたが、「1.2.3.4.5」と順番にならずに「1.5.9.10.13」と飛び飛びになっている現象があり、それが原因で障害が発生した。

 

飛び飛びになっていた理由

INSERT ~ ON DUPLICATE KEY UPDATEを使った場合、次回のインサート時はIDが飛んでしまう模様。以下実験を行った。

 

実験

まず以下のようなテーブルを作った。テーブル名はtest_table。IDと名前と何らかの得点的なテーブル。

 

データを2行入れてみる。

 

この時点でのデータは以下の通り。

 

INSERT ~ ON DUPLICATE KEY UPDATEで更新をかけてみる。

 

この時点でのデータは以下の通り。

 

先ほどは更新だったけど、インサートになるようにINSERT ~ ON DUPLICATE KEY UPDATEを使う。

 

すると以下の通りIDが飛んでしまう。

尚、MyISAMで同様のテストをしたところちゃんと連番になった。

 

注意したい点

データが飛ぶのは問題なかったんだけど、頻繁に更新するプログラムだった為、IDがint型の上限を超えてしまうということが発生してしまった。しかも常時更新タイプのものだったのでその時点で障害が発生。

InnoDBでINSERT ~ ON DUPLICATE KEY UPDATEを使うときの挙動は覚えておく。

 - MySQL

  関連記事

msyql-image
MySQLで月別に集計を行う。あと日付時刻関数。

現在進行形でやっているデータ集計系だけど 新たな発見があったのでメモ。 ■日付時 ...

msyql-image
MySQLが起動も再起動もできない

サイトで障害が発生した。FTPやSSH接続は出来るけどサイト自体は表示されない。 ...

msyql-image
SSH接続でMySQLにデータをインポートする

phpMyAdminが入っていなかったり、SQLファイルが大きかったりという理由 ...

msyql-image
MySQLで複数のコード及びスコアで検索して、スコアが無いものは0を取得する

やりたかった事は下記の通り。 ・ユニークなコードがあり、そのコードに対して複数の ...

msyql-image
テンポラリテーブルで高速化

5000万件ぐらいデータが入っているテーブルから 日本語検索しないといけないケー ...

msyql-image
MySQLで開始から終了日付内を調べたいとき

等号不等号でもできるけど、BETWEENというのがよさそう。 ■参考サイト ht ...

msyql-image
MySQLでカラム数の異なるテーブルを結合する(UNION)

MySQLでカラム数の異なるテーブル同士をUNIONで結合させたかった。ただ、何 ...

msyql-image
MySQLで加算しつつNULL値は0にする

いくつかのコードに対して投票を行い、 その合計値をスコアとして出したい。 ただ、 ...

msyql-image
MySQLで構文エラーが出た際は予約語も疑う

MySQLで構文エラーが発生しており、チェックしたところ、どう見ても構文的には間 ...

msyql-image
MySQLで文字列の置換

MySQLで文字列の置換を行いたかった。以下に方法をメモ。   置換方 ...