まとまりのないブログ

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

sqlインジェクション

ns.km22518.keymachine.de – – [19/Jul/2008:22:25:12 +0900] “GET /wordpress/index.php?cat=%27+UNION+SE …

no image

mysqlのテーブルから不要なインデックスを削除する

テーブルを設計し直すために不要なインデックスを削除してみることにする。 mysql> drop index idx1 on ac200902; Query OK, 49398993 rows affe …

no image

mysqlのレプリケーションでのエラー

[ERROR] Slave: Error ‘You have an error in your SQL syntax; check the manual that corresponds …

no image

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

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

no image

Wrong bytesec: 49-48-48 at linkstart: 14313808772

またテーブルのクラッシュ。mysqlのテーブルがクラッシュする頻度が激増してきた。以前はこんなことなかったのだが・・・。今は一日一回発生して絶えず見張っていなければならないという状態になってしまってい …