今最もポピュラーなMySQLというデータベースシステムについて、基礎をまとめみてみる。
MySQLは、データベースを扱う言語の一つと思って良い。
すなわち、MySQLには、様々なデータベース形式(ストレージエンジン)が存在する。
中でも重要なのは、『MyISAM』と『InnoDB』の2種類だ。これ以外を使う事は無いに等しい。
■2種類を簡単に説明すると。
・『MyISAM』は、読み込みに特化した形式。大量の同時書き込みが苦手。
ある行を書き込み中は、他の行を書き込みできない。読み込み中も書き込みができない。
・『InnoDB』は、複数行の同時書き込みが可能。書き込みに特化した形式と思えば良い。
ただし、読み込みが遅く、メモリを大量に必要とする。
一般には、小さなサイトや、大量の同時書き込みが発生しないテーブルはMyISAMを使う。
個人サイトレベルはMyISAMと思っても良い。
逆に、大手サイトでは沢山のユーザーが同時に書き込みを行うから、同時書き込みができないMyISAMでは順番待ちでタイムアウトしてしまう。だからInnoDBを使うケースが多い。
■MyISAM
仕組みを分かりやすく説明すると
データベース = ディレクトリ(フォルダ)
テーブル = ファイル
となっている。
テーブル数の上限は、サーバーのシステムによって違う。
Windowsなどでファイルの多いフォルダを開く時、長く待たされることを経験した事は無いだろうか。
データベースでも同じである。テーブルが多ければ、接続時に時間がかかる。
■インデックス
インデックスとは、目次のこと。目的のデータに瞬時にアクセスするために必要なものだ。
ただし、初心者には少し難しいシステムでもある。
まず、インデックスが必要なのは、1万件以上に及ぶ大きなテーブルのみである。
千件程度の小さなテーブルでは、逆に遅くなる場合が多い。
また不必要にインデックスを増やせば、そのインデックスを作成するぶん遅くなる。
検索を行う時、最も適したインデックスが自動で選ばれて使用される。
ただし、使うインデックスはどれか一つのみである。
すなわち、複数のフィールドを検索(ソート)する場合、注意が必要である。
検索条件にあった複数対応のインデックスを用意しなければ意味が無い。
その他にも色々制約があるため、使いこなすにはマニュアルをよく読む必要がある。
■MySQL4.1以降
バージョン4.1から、文字コードの扱いが変更となった。
今までは、MySQLを呼び出すソフト側で文字コードを変換する必要があったが、4.1からはMySQL側が自動で行うようになった。
すなわち、自分で文字コードをいちいち変換させる命令を書く必要が無くなり、楽になったと言える。
これにより、実質、MySQL側の文字コードを気にする必要が無くなった。
MySQL上のデータがSJISだろうがEUCだろうが、関係なくなったわけだ。(ソース側の文字コードを気にする必要は今までどおりあるが)
ではデータベースの文字コードは何を意味するのだろうか。
それは、ソートである。どの文字コードでも意識しないで扱えるようになったが、ちゃんと指定しないとソートがうまくいかない。あたりまえである。
また、文字変換のタイムロスをなくすため、ウェブと同じ文字コードにすると良いだろう。
問題が無い限り、『UTF8』をお薦めする。日本語特有の問題がなくなるからだ。
気をつけることは、ソース側の正しい文字コードをMySQLに知らせることだ。でなければ、コード変換が正しく行われない。あたりまえである。
iniファイルに記述する方法や、MySQL構文でそのつど指定する方法などがある。
正しく指定しなくても、読み書きは大抵正常に行われる。間違った変換で記録しても、読み込み時に元のコードに変換されるためだ。このため、ウェブ側では文字化けが起こりにくい。
ただし、ソートはめちゃくちゃとなる。
もちろん、他の違う文字コードで書いたソース(ページ)では、文字化けを起こす。
なので、きちんと文字コードを指定する必要がある。
一つのデータベースを使い、EUCで表示するページやUTF8で表示するページがある場合もあるだろう。
古いサイトはEUCで作られており、最近のサイトはUTF8で作っている人も多いはずだ。
この場合の文字コード指定方法の一つに
mysql_query("SET NAMES UTF8"); (PHPでの書式)
がある。
データベースに接続後、一度だけこれをやれば、接続を閉じるまで有効となる。
■MySQL4.1未満から、4.1以上へ移転する場合
上記の文字コードの扱いのみに注意するだけである。
デフォルトの文字コードは、おそらく『latin1』となっているだろう。
エクスポート&インポートで移転する場合は、注意が必要である。
まず、エクスポートしたファイルはEUCかSJISとなるはずだ。
この文字コードは、そのままにし、UTF8に変換してはならない。
そして、『CREATE TABLE』文の最後に、テーブルの文字コードを書き足そう。
『) ENGINE=MyISAM DEFAULT CHARSET=utf8;』
などとすれば良い。
そしてインポートすれば、正しく文字コード変換がされるはずだ。
以上が、まず知っておきたい基礎事項である。