2020年4月16日木曜日

【MySQL】インデックス作成はテーブルを一時コピーして作らない。

なぜこんなことを記事にしているのか。

 仕事上、MySQLのALTER TABLE文は、テーブルを一時的にコピーしてから新旧テーブルを入れ替える形で処理されていると知った。 そうなのか!?と驚き、検索をかけた。


どこにそんなことが書かれているのか。

 下記記事を参照。

ALTER TABLEを上手に使いこなそう。


MySQLのドキュメントはどうだろうか。

 以下のリンク先に書かれていた。

13.1.7 ALTER TABLE 構文

一部引用すると

ストレージ、パフォーマンス、および並列性に関する考慮事項

ほとんどの場合、ALTER TABLE は元のテーブルの一時的なコピーを作成します。MySQL は、そのテーブルを変更しているほかの操作を待ってから、処理を続行します。そのコピーに変更を組み込み、元のテーブルを削除したあと、新しいテーブルの名前を変更します。

ALTER TABLE後のテーブル定義でコピーを作って、最終的にそちらを使うことになっている。


インデックス作成はどうなのか。

 やりたかったのはインデックス作成なので、それはどうなのだろうかとドキュメントを追ってみたところ、以下の引用部分を発見した。

一部の操作では、一時テーブルを必要としないインプレース ALTER TABLE が可能です。
  • ・・・
  • InnoDB と NDB に対するインデックスの追加または削除。

インデックス作成と削除は大丈夫ということだ。一安心した。InnoDBというのは検索をすればすぐに答えが出てくるので、気にしなくてよい。


【Python】演算子 in は数値や文字列の混合配列でも評価できる。

 Pythonのin 演算子を検索すると、だいたい数値や文字列のみを要素とする配列と比較している例が目立つが、数値と文字列を混合した配列でも比較することが可能である。

ドキュメントを見てみる

 Pythonのドキュメントを見てみよう。
6.10.2. 所属検査演算

ここには以下のような記述がある。

演算子 in および not in は所属関係を調べます。 x in s の評価は、 x が s の要素であれば True となり、そうでなければ False となります。

ドキュメント上では、配列要素が1種類のときに限定している記述はない。

試してみる

Python 3.7.3 (default, Apr  3 2019, 05:39:12)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 3 in [ 4, 'abc', 'cdf' ]
False
>>> 4 in [ 4, 'abc', 'cdf' ]
True
>>> [3,4] in [ [1,2], [3,4] ]
True
>>> [3,4] in [ [1,2], [3,5] ]
False
>>> 'abc' in [ 4, 'abc', 'cdf' ]
True