MySQLの履歴
データベース。
フリーで軽くて、なんだかわからないデータを投入しても無視して走り続けたり(ストリクトモードじゃない場合=デフォルト)してくれるのでなんていうかデータベースの安物っていうイメージがあります。ごめんなさい。
オープンソースのデータベースには他にPostgreSQLとかがあります。
注意すべきこと
SQL上で整数値の閾値を越えて足したり引いたりすると値がオーバーフローする。エラーは出ない。
Perlを使っているような人は要注意!
例:UNSIGNED INT の値で、0 から 1 を引くと、4294967295になる。
ちょっと便利なこと
各カラムの型が数値型でも文字列型としてデータを入力することができる。
UPDATE table SET int_column = '2' WHERE key_id = '24';
知らなかった…
ALTER TABLE で複数のことを同時にする
ALTER TABLE table_name DROP column1, DROP column2, ....
こうすると複数のカラムを削除したり、追加したりを一度に行うことができる。
たくさんのレコードがあるようなテーブルの構成を変更するときに便利。アプリの移行時間の短縮ができるかも。
ところで、複数のカラムを操作するときには、
ALTER TABLE table_name DISABLE KEYS;
で、インデックスを無効にしておくとよい。カラムを操作したりするだけでインデックスの再構築を行うのを防止する。
復活は、
ALTER TABLE table_name ENABLE KEYS;
いま、インデックスが有効かどうか調べるためには、
SHOW INDEXES FROM table_name;
いちばん右のカラムに'disabled'が表示されているかどうか確認しよう。
最適化
データベース接続の最適化を行う方法はいくつかあるものの、とりあえずマニュアルだけは参照したほうがよい。
MySQL 5.1 リファレンスマニュアル :: 6 最適化
VIEWにINSERTはできますか?
固定長テーブルと可変長テーブルを分割して高速化を図ろうと思ってますが、現在のテーブルはviewで残したいなと思ったのです。
が、INSERTについては自分のような未熟者が期待している動作はしないと思います。
For a multiple-table updatable view, INSERT can work if it inserts into a single table. DELETE is not supported.
http://dev.mysql.com/doc/refman/5.0/en/view-updatability.html
INSERTで挿入するデータが一つのテーブルを対象としているものに限り挿入できるようです。なので、全部のレコードを埋めて挿入しようとした場合には失敗します。
ちなみに、"multiple-table updatable view"には1対1でテーブル同士が関連付けられているなどの条件があります。
データベースの設定値を変更する
key_buffer_size について
MyISAM テーブルのインデックス ブロックをバッファし、すべてのスレッドで共有。key_buffer_size は、インデックス ブロックに使用するバッファのサイズである。キー バッファはキー キャッシュのこと。
(中略)
環境に応じて、インデックス処理 (すべての読み込みと複数の書き込み) を改善する目的で、この値を大きくできる。一般的には、マシンのメモリ使用率 25 % の値であることが好ましい。
マニュアルにはこう書いてあるものの、開発機のデフォルト(CentOS 5)は8Mちょっとだった...
他にもいろいろあるのでググるといいと思う。
http://dsas.blog.klab.org/archives/50860867.html
http://it.kndb.jp/entry/show/id/5
知っておくと幸せになれる
ページャーを less コマンドに設定する。-S オプションで横スクロール!
mysql> \P less -S
MyISAMのインデックスの構築
MySQL 5.1 リファレンスマニュアル :: 4 データベース管理 :: 4.2 mysqld — MySQL サーバ :: 4.2.3 システム変数
myisam_sort_buffer_size - この変数の値を変更するとインデックスの構築に多くのメモリを割いてくれるらしい。コネクション別に設定される。(デフォルト:8388608)
特定の接続を強制切断する。
mysqladmin processlist | grep 192.168.2.12
これでどのコネクションかを左側に出てくるコネクションIDで指定し、mysqladminのkillコマンドを使ってkillする。
データベースのファイル
多くの場合、
/var/lib/mysql
に、データベース名のサブディレクトリとして保存されている。
開発機でバックアップを取るのに適当な名前(xxxx_bakみたいな感じ)を付けて保存したらその名前の新しいデータベースが作られてて驚いた。
多分、データベースの権限をロールに設定したらそのまま使えるんだと思う。(試してない)
バックアップ
ちなみに、データベースが起動中の場合のバックアップはmysqldumpとかを使った方がいい。
データベースが動いているときにコピーすると多分データベースが壊れる。
開発機などで、データベースを止めてもいい場合には、
/var/lib/mysql
を直接コピーした方が速いのでお勧め。ただし、ユーザー権限を正しく元に戻すのも忘れないこと!