インデックス列には日本語よりも英数字を使うほうが良いのか悪いのか

テーブル内に存在するレコード数をカウントする時、where句にインデックス列を条件として指定して実行時間がどれほどかかるかテストをしてみた。テーブルの全レコード数は約1600万レコードで、カウントすべきレコード数はそのうちおよそ約70万レコードであるとする。サーバのスペックとしてはcpuがAMDのクアッドコア2.1GHzでメモリ2GB、DBソフトウェアはmysql5.0といったところ。

mysql> select count(*) from aTable where aField = 'サンプルワード';
+----------+
| count(*) |
+----------+
|   690035 |
+----------+
1 row in set (7.41 sec)

結果は上記の通り7.41秒かかった。aFieldというのはインデックスが作成されている列である。カウントで7秒強もかかるのはちょっと時間がかかりすぎているため、どうにかして短縮させるべくaFieldの値を英数字にすることにした。update aTable set aField = ‘sampleword’ where aField = ‘サンプルワード’という具合に。ちなみに、約70万件のレコードをアップデートするのに約1時間10分もかかった。英数字にアップデートしたあとで同様にテストしてみる。

mysql> select count(*) from aTable where aField = 'sampleword';
+----------+
| count(*) |
+----------+
|   690035 |
+----------+
1 row in set (3.30 sec)

結果は上記の通り3.3秒に短縮することができた。印象では日本語で検索をかけるよりも英数字で検索をかけた方が速そうな気はするが、実際にテストしてみると数字の上で明らかな差が表れた。

他のキーワードでも試してみたが、バラつきはあるものの、検索対象のキーワードが英数字の方が結果が表れるまでの時間が短いという傾向を示した。DBの設計をするときにはパフォーマンスを維持するためにフィールドに入れるデータの形式も綿密に考慮する必要がある模様。そして、全文検索は良いとして、インデックス列に入力する値は極力英数字のみを値として入力するように設計したほうが良い。数千~数万程度のレコードであれば日本語であろうと時間差は無視しても良い程度かもしれないが、数千万~億を超えるレコードを扱う場合にはその差が明らかになる。後になればなるほど修正するのが大変になるため、初めのDB設計が非常に重要になる。とは言っても、どんなに注意深くやっても完璧な設計などは仕様もなく、少しずつ修正を重ねてベストに近づけていく他はないのかもしれないが。

コメントを残す

メールアドレスが公開されることはありません。