まとまりのないブログ

something which something is something

mysql sql

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

投稿日:

テーブル内に存在するレコード数をカウントする時、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設計が非常に重要になる。とは言っても、どんなに注意深くやっても完璧な設計などは仕様もなく、少しずつ修正を重ねてベストに近づけていく他はないのかもしれないが。

-mysql, sql

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

関連記事

no image

myisamchk: error: myisam_sort_buffer_size is too small

myisamchkを実行したときに myisamchk: error: myisam_sort_buffer_size is too small Try fixing it by using the …

no image

Table is marked as crashed

昨日、プログラム側でmysqlのテーブルがクラッシュしているという返事を受け取った。はあ、またか・・・と思いながらcheck tableを該当するテーブルで実行してみる。

no image

メタ文字のエスケープ

sqlインジェクション対策の一つのメタ文字のエスケープ処理。ローカルで利用するwindowsアプリケーションなので、インターネット上のwebアプリのように攻撃されることはないけれど、操作している上でメ …

no image

mysqlの運用時のトラブルと試行錯誤のメモ

条件 1分間にクエリの実行が30回〜60回程度発生する。 結果のテーブルは7フィールドの数千〜10万件レコード程度のテーブル mysqlのスペックはCPUがcore2duo,メモリが8GB,他のサービ …

no image

mysql インデックス バックアップ

mysqlのインデックスの作成やテーブルのバックアップ方法についてのメモ。