まとまりのないブログ

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

Blitzという名前のついたバルクメモリ

PCがやたらとフリーズするのでなんでだろうかと悩んでいた原因がわかった。アプライドの特価品メモリを使っていたのが原因だった。メモリの相性が悪かった、というより不良品のメモリであるというのが正しい表現だ …

no image

結果の行数をカウントする

mysqlで結果の行数をカウントするsql文は、 seletc count(*) from foo; で取得するのが最も簡単ではあるけれど、レコード数が膨大な場合にはパフォーマンスの面で問題になる場合 …

no image

古いMySQLをインストールした時にlibncursesw.so.5がないと怒られた

MySQL5.087をインストールしてデーモン起動してログインしようとしたら # ./bin/mysql -u mysql ./bin/mysql: error while loading share …

no image

eclipseのプロジェクトのソースファイルが全部消えた

eclipseで普通にデバッグ作業していただけなのにいきなりワークスペースのプロジェクトのフォルダ内のファイルが全部消えた。今までこんなことは経験がなかったので焦った。 消えるきっかけとなった原因 j …

no image

Table 'テーブル' is marked as crashed and should be repaired

データベースへ接続してsqlを実行したときに Table ‘テーブル’ is marked as crashed and should be repaired というエラーが返ってきた。エラーの内容は …