• ベストアンサー

MySQLに格納するデータと検索速度

MySQLに都道府県のデータをinsertしたいのですが、「北海道」という文字にするか、置き換えて数字の「1」にしようか迷っています。 「北海道」という文字をinsertした場合は、取り出したときにそのまま表示できるので便利かなと思っています。 しかしながら、抽出する際に「北海道」という2バイト文字で検索するのもどうなのかと思っています。 抽出する際には数字の「1」などの方が早いような気もするのですが、数万件のデータだったら「北海道」などの2バイト文字を検索しても問題ないでしょうか? このような場合の定石がありましたら教えてください。

  • MySQL
  • 回答数3
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

都道府県名テーブルをつくりidを振り、必要に応じてINNER JOINでつなげる という流れでしょうね。 >「北海道」という2バイト文字で検索するのも それはそういう仕様だと思えばそんなにおかしなことはありません。 速さだけでいえば、この程度のことでは体感的に感じるスピードに 違いはないと思います。

astu2006
質問者

お礼

どうもありがとうございました。 参考になりました。

その他の回答 (2)

回答No.3

>数万件のデータだったら「北海道」などの2バイト文字を検索しても問題ないでしょうか? 何百万件と操作すれば、体感できるくらいの差が出るかも知れませんが、数万件程度なら大差ないです。 前長野県知事が、「県名を信州にしよう」といった自論を展開したり、今後、道州制の導入に関し議論もあります。つまり、都道府県名は変わる可能性があるので、都道府県マスタを作って、idで対応付けた方がベターだと思います。

astu2006
質問者

お礼

どうもありがとうございました。 参考になりました。

回答No.2

一意な値の数は最大で47ですし本当にそれが原因で遅くなるようでしたらインデックスを追加すればいい話ですのであまり気にする必要は無いとおもいます。 ただし都道府県は全国地方公共団体コードで番号が定められており日本工業規格にも登録されているためこれに合わせて設定しておけばドキュメントが失われても関連を容易に推測できることから数字にしておくデメリットが少ないのも事実です。 また数字で扱いますとデータを新しいデータベースに移したら都道府県名が全て文字化けしていたなどの文字コードの問題も心配なくなります。 これらの条件をふまえて今回の場面で最適だとおもうものを導入すればよろしいかとおもいます。 全国地方公共団体コード http://ja.wikipedia.org/wiki/%E5%85%A8%E5%9B%BD%E5%9C%B0%E6%96%B9%E5%85%AC%E5%85%B1%E5%9B%A3%E4%BD%93%E3%82%B3%E3%83%BC%E3%83%89 数字で行ってINNER JOINが面倒な場合はプログラムの方に配列をつくって表記してしまう方法もあることですし。

astu2006
質問者

お礼

どうもありがとうございました。 参考になりました。

関連するQ&A

  • エクセルをMysqlに格納

    いつもお世話になっております。 Linux,mysql,PHP,apacheの環境で試しているのですが、 エクセルデータをアップロードし、MysqlのBLOB型に格納したいと思っております。また、格納したMysqlのエクセルデータをダウンロードできる流れを考えております。 テンポラリファイルをそのままINSERTするとデータは格納されるのですが、抽出したときに文字化けしてしまいます。 エンコード方法など何か指定するのかと思うのですが 調べたのですが見つかりませんでした。 内部エンコードはEUCになっています。 説明不足な点があるかと思いますが、ご教授お願いします。 /*insert時*/ $localfile = file_get_contents($_FILES['userfile']['tmp_name']); $sql = "INSERT INTO TABLE (fileup) VALUES '".$localfile ."'"; /*ダウンロード時*/ header("Content-type: application/vnd.ms-excel"); header("Content-Disposition: inline; filename=\"".date('Ymd')."list.xls\""); echo $binary;//selectで抽出した時のデータ

    • 締切済み
    • PHP
  • MySQLで格納されたデータを取得したい!

    MySQLで格納されたデータを取得した際に メンバを取得するにはどうしたらいいですか? 御存じの方、教えて下さい!お願いします! MySQL ------------------------------- 食品 | 材料 | 数量 | ------------------------------- 食品(1) | 材料(1) | 数量(1) ------------------------------ 食品(2) | 材料(2) | 数量(2) ----------------------------- 上記のようにでーたベースに格納してる場合に 数量(2)を知りたい場合はどのようにするのでしょうか? 取得でできた(数量(2))を構造体に格納したいのです。 現在は、mysql_query(host,"select ~"); して、mysql_store_result(); してサーバからデータを抽出した状態で 参照したい行の何列目かを知りたい場合の方法がどうしたらいいのかわかりません。 ちなみに mysql_fetch_row()を使用する場合だったら ポインタのポインタって考えればよいのですか? よろしく御教授お願いいたします!

  • mysqlで長さ無制限の文字列を格納することはできますか?

    mysqlを用いて掲示板を作りたいです。その際に、簡素化のため、掲示板の全てのデータをmysqlに格納したいと思っています。 また、掲示板における本文の部分は、文字列の長さを無制限にするのが妥当だと思います。 しかし、mysqlのマニュアル(http://dev.mysql.com/doc/mysql/ja/BLOB.html)によると、一番大きい型であるLONGBLOB型の記憶容量は 2^32バイトとなっており、それを超える文字列は切り捨てられるとなっています。 そこで、ご教授いただきたいです。 長さ無制限の文字列をmysqlに格納する方法はありますか?そしてその場合はどうすればよいですか? それとも、長さ無制限の文字列をmysqlに格納する方法ははなく、その場合は別ファイルを用意し、そちらに書き込むなどをする必要がありますか? どうぞよろしくお願いします。

    • ベストアンサー
    • MySQL
  • MySQLにて、点数の抽出文

    MySQLを利用して点数の抽出をしたいと思います。 -------------------------------------- point | -------------------------------------- 9 1 1 5 6 6 3 2 1 9 2 3 8 9 9 4 3 -------------------------------------- というテーブルデータがあったとして、point の存在する順が欲しいのです。 PerlからMySQLを利用しています。その際のSQL文が知りたいです。 point 9 が4件で一番多いので 9 という数字が最初に返り、 point 3 が3件で二番めに多いので 3 という数字が次にかえってくる という風にしたいのですが、可能でしょうか?

    • ベストアンサー
    • MySQL
  • MySQLで先頭の0が省略されてしまう

    こんにちは、 Mysqlで、例えば"023"という数字をデータベースへinsertした場合、 先頭の"0"が省略されてしまい、"23"となって格納されてしまいます。 データ型はint、textを試しましたが結果は同じでした。 検索してもいまいちこれといった情報が見つからず、 教えていただきたいと思っています。 簡単ではありますが、どうかよろしくお願いします。 環境:windowsOS    xampp 1.7.1 php5を使ってMysqlを操作しております。

    • ベストアンサー
    • MySQL
  • insert into $DB (data1, data2) values (\"$data1\", \"$data2\")で変数扱いされません

    $sql = "insert into $DB (data1, data2) values (\"$data1\", \"$data2\") ; PHPにてMySQLを操作していますが、上記のように insertする項目の文字列に数字が入ると insertする際に、data1がそのままdata1として書き込まれてしまいます。 $sata1 = 'text or int'; data1 = $data1; として書き込みたいのですが… アドヴァイスお願い致します。

  • MySQLにおける検索速度について

    はじめまして。 GOOと同じWeb上における質問&回答システムのようなものを作っております。 サーバ構成は、 CPU:2.4GM MEMORY:1GM OS:RedHat7.2 WWWサーバ:Apache1.3x DB:MySQL3.23 インターフェースにはPHP4.2を使用しております。 テーブル構成は、基本的に、 [質問テーブル] 質問No.(PK) 質問タイトル 質問内容 [回答テーブル] 回答No.(PK) 質問No.(FK) 回答内容 のようにしております。 検索の方法は、 該当件数は、select count(質問No.) from 質問テーブル で取得し、 一覧は、select * from 質問テーブル limit a,b order by 質問日時; のようにlimitを使用して表示する件数だけ取得しています。 現在ダミーデータを使用してテストしています。 同時アクセスのないローカルで単体でテストしています。 1万件をこえるあたりから急に検索のときにつっかかるくらいの遅滞が発生し、 3万件からそれが顕著になり、 30万件では2秒くらいかかります。 これはしょうがないのでしょうか。 「教えてGOO」等はすぐ検索されますが、どのようになっているのでしょうか? 検索の早いMySQLとはいえフリーだからしょうがないのでしょうか。 MySQLはデフォルトの設定のままです。 (MySQL使用するメモリ等を多少いじってみたのですがあまり変化がありませんでした) 個人的には、あとは、MySQLの適切なパラメータ設定、テーブル設計あたりだと思っているのですが、経験不足でこれだというものが思いつきません 宜しくお願い致します。

  • MySQLで辞書を作っています。データ量と検索スピードについて質問です

    MySQLで辞書を作っています。データ量と検索スピードについて質問です。 はじめて質問します。 今、PHPとMySQLで辞書システムを作っています(初心者です)。日本語と(恥ずかしながら)中国語の辞書なのですが、単純に単語を検索する機能と、検索した文字列(=単語)を含む例文を表示する予定です。ついでにその単語が属するカテゴリーがあり、そのカテゴリーに対応したアフィリエイト広告を表示させるのですが、データ件数が増えた場合、MySQLのスピードがどうなるのかが気になります。 具体的には、将来的に日本語単語が15万語、それに対応する中国語単語が15万語、さまざまな例文が20万件くらいになった場合、MySQLの検索スピードは明らかに体感できるほど落ちるものでしょうか。合計1万件程度の時と比べてどうでしょうか。 よろしくお願いします。

  • AccessでMysqlに繋ぐとデータ型がかわる。

    Mysqlでテーブルのデータ型が”char”がAccessでは数値型で表示されます。 なぜ、勝手にデータ型が変更されるのでしょうか? データ型が変更されるデータは郵便番号です。 郵便番号データにハイフンはありませんが、北海道は0から始まっている数字があります。 【その他】 mysql 5.0 MyODBC 3.51 access 2003

  • MySQLやSQliteの中のデータ検索速度について

    ざっくりとした回答で結構ですので、データベース言語のバージョンについては、あえて記載を省きます。 環境:Apatch、Linux、PHP4、SQlite2 バージョンによって動作が異なるのであれば、その場合には適宜補足します。 なお、私はデータベース言語の知識をそれほど持っていませんので、分かりやすく記述して頂けると大変助かります。 --------------------------- では、本題に移らせて頂きます。 現在、PHP4とSQlite2の組み合わせでスクリプトを制作中なのですが、 その際に、データベース(以下、DB)の中のデータを検索・抽出することがあります。 SQliteのコマンドでは、SELECT文を使った記述になります。 (恐らく、MySQLなどでも同様だと思います。) で、知りたいことは、 DBをどう構築したら、「検索・抽出」速度が遅くなりにくいか(高速になりやすいか)。 これが知りたいわけです。 私が考えている方法は、いくつかあって、それらについて、 速い遅いの意見を覗いたいと思います。 また、もっと良い方法がありましたら、そちらも教えて下さい。 想定しているDBは、例として、簡単に以下のものとします。 例:学年の生徒DB クラスがA組~E組まで5クラスあります。 生徒の、 氏名、性別、クラス、出席番号、生年月日、所属している部活名、担当委員、欠席数 のようなものを記録するDBだと思って下さい。 さて、この例において、以下のどの形式が良さそうでしょうか。 方法1: (DBファイルを1つ用意) DBをCREATEするときに、TABLE名を tbl_all という風に1学年全体で記録するような形式。 方法2: (DBファイルを1つ用意) DBをCREATEするときに、TABLE名を tbl_a ~ tbl_e という風に分け、それぞれのテーブルに各クラスの生徒データを記録するような形式。 方法3: (DBファイルを複数用意) DBをCREATEするときに、クラスごとに、DBファイルを「db_a.sqlite2」~「db_e.sqlite2」のように作成し、それぞれにおいて、TABLEを1つ作り、そこにクラス内の生徒のデータを記録する形式。 どの形式のDBが、速く(もちろん正確に)検索・抽出(SELECT)できるでしょうか。 一般論でも結構です。 また、データ数が多くなるにつれ、速度が逆転するというような場合には、そちらも教えて下さい。 この例では、クラス数が5なので、比較的データは少ないですが、 私が構築しようとしているDBでは、データを1万件以上扱う可能性が高いので、その点も考慮して、アドバイスして頂けると嬉しいです。 以上、よろしくお願い致します。

    • ベストアンサー
    • MySQL