• ベストアンサー

データベースにあった効率なフィールドの書き方?

MySQL4とMySQL5を使っています。 データベース不慣れで、言葉や考え方が間違っているかもしれませんが、 例えば以下のようなフィールドを持つテーブルがあり、 どちらがデータベースにとって効率良い(スピードやDBサイズ) のでしょうか? 例1)1レコード128バイト bigint position zyusyo char(120) 例2)1レコード256バイト bigint position zyusyo char(248) MySQLに限らず、他のDBもフィールドの定義仕方で効率が変わることは、あるのでしょうか? このようなことはDBチューニング?というものでしょうか? 語彙不足で申し訳ありません。

  • kyoui
  • お礼率0% (0/80)
  • MySQL
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
回答No.2

例が悪すぎます。 char(120)で管理できるものを、char(248)と定義するなら、無駄なスペースを作ることになります。 char(248)が必要なものを、char(120)で管理するなら、全情報を得る場合は複数行の検索が必要になります。 1.ページと行長  多くのRDBMSは、ページといった単位でI/Oを行います。行長が短ければ、このページ内に複数の行を格納できます。行長が長ければ、ページ内に格納できる行数が少なかったり、使われないスペースが増えます。 複数行を順次検索するような操作が多いなら、ページ内の格納行数が多ければI/O回数を減らせますが、ランダム検索するような操作が主体なら、I/O回数は減らせません。 また、ページ内に複数行が格納されている場合、RDBMSによる排他制御が行単位ならいいですが、ページ単位の場合は異なる行を操作しているのに、排他制御で待ちになることがあります。 2.固定長列と可変長列  可変長列を使えば、無駄なスペースを持たずにすみます。また、非常に長いデータを持つこともでき、RDBMSによってはページ長を超える場合でも、複数ページに分割格納してくれます。しかし、分割格納されるということは、1行の操作で複数回のI/Oが発生することになります。また、インデクスを付けたり、ソートやグループ化などが行える列長に上限がある場合が殆どなので、無闇に長いデータ型を使うべきではありません。  RDBMSによっては、表の構成列が固定長のみの場合は、内部的なスペース管理が簡単になることなどで、大幅な性能向上ができるものもあります。 3.列数  SQLでは列単位で操作できる一方で、多くのRDBMSでは、列数が多くなると、CPU使用時間が長くなり極端に性能劣化します。そのため、正規化だけでなく、無闇に細かな列をたくさん作るのは、十分に注意が必要です。 >このようなことはDBチューニング?というものでしょうか? これらは、DBの論理設計や物理設計の範疇です。

その他の回答 (1)

  • Tasuke22
  • ベストアンサー率33% (1799/5383)
回答No.1

テーブルは小さいほうが効率的であることは間違いありません。 効率の小さな問題はDBのマネージャが頑張っているので、開発者 はあまり意識する必要は無いと思います。 寧ろ、分かり易さ、テーブル設計における拡張性などを最初は 意識するべきでしょう。 拡張性は、初期段階では効率が悪いように思えますが、DBのフィ ールドやテーブルががどんどん増えたりするようなシステムでは、 将来的な効率の悪化が抑えられます。

関連するQ&A

  • accessのルックアップフィールドのような複数値を持つフィールドの機

    accessのルックアップフィールドのような複数値を持つフィールドの機能があるデータベースはOracle,MySqlみたいなDBにはないでしょうか? それかない理由でもあるのでしょうか?結構便利だとは思うんですが検索して調べてもなかなかでてこなかったです。

  • 複数データベースへの問い合わせ

    同一サーバーに(DB1,DB2,DB3)と複数のデータベースがあった場合(ユーザーは同じです)、SELECTの際に複数のDBに対しての問い合わせをすることはできるのでしょうか? それぞれのデータベースはテーブルも全く同じ構造で、 そこから特定のフィールドのレコードだけを引っ張り出して使いたいのですが、SQLをどのように書いていいのかがわかりません・・・ ヒントだけでもいただけると嬉しいです。よろしくお願いします。

  • 正規表現の使えるデータベースとSQL文の書き方が知りたい

    正規表現の使えるデータベースとSQL文の書き方が知りたいのですが、 Access2003,MySQL5,PsotgreSQL8のうち、可能なDBはどれでしょうか? たとえば、以下のように128バイト固定長のアルファベットの大文字小文字と数字のレコードがあり、 ^ABで検索すると、(2),(3)のレコードを抽出するSQLの書き方が知りたいのですが、可能でしょうか? AAACCC...(1) ABBCCC...(2) ABCCCC...(3) できればアクセス2003でできるとうれしいですが、可能なDBをご存じの方教えて下さい。 また、やはり速度的に非常に遅いものになるでしょうか?

  • データベースの検索について

    ORACLE8.0.5において 日付を管理するテーブル(Work)において <構成>  workday char(08) not null (key) work7day char(01) workym char(06) 上記の構成のテーブルにおいて 指定日付(例:20020125)から、5レコード目の データを抽出するときの、SQLの組み方を教えてください。 PLSQLを使用して、上記のDBをアクセスし、5レコード目 (レコードが持っている営業日)を抽出しようとしています。よろしくお願いします。

  • 一つのフィールドに複数の情報を持たせたいです。

    データベースに詳しい方!一つのフィールドに複数の情報を持たせたいです。 例えば複数のユーザを管理するテーブルにあるID(フィールド)を 複数個をデータベースに保存する場合どうすればいいのでしょうか? 言語はJavaで、データベースはMySQLを使っています。 ↓↓各フィールド(例) -------------------------- || userName || userID || ○○ID || -------------------------- 上記の 「○○ID」というフィールド に複数の値を持たせたいのです。 String型の配列、もしくはXMLをMySQLの一つのフィールドに保存する 事はできるのでしょうか? (もし出来るのならこちらを採用したいです) それとも○○IDに関連するテーブルを作成する(?) それか最悪の場合、ユーザが増えるたびにテーブルを一つ作成 して管理するか・・・・(避けたいです) 宜しくお願いします。

    • ベストアンサー
    • MySQL
  • phpによるデータベース操作について(MySQL)

    http://www.yc.tcu.ac.jp/~yamada/doc/mysql/win/0602.html のサイトを参考に以下のような「データベースの内容を表示させる」プログラムを書いたのですが、うまく表示されません。(webブラウザで確認したところまっさらなページで何も表示されません) ちなみに、私はレンタルサーバを借りており、その中で作成したデータベースにphpMyAdminにてテーブルやカラムの作成を行いました。以下のプログラムは「db_sample.php」という名前で保存(エンコード:utf-8)し、レンタルサーバーの公開しているフォルダ「httpdocs」にffftpにてアップロードしています。バージョンは、phpMyAdmin2.11.11.3と、php4.1?(最新の5.2よりひとつ前のもの) ここでは仮に ホスト名:aaa.com (←これは独自に作成したドメイン名でいいのかな?) ユーザー名:user パスワード:pass データベース名:db テーブル名:person とします。 ----------以下プログラム------------ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Style-Type" content="text/css"> <meta http-equiv="Content-Script-Type" content="text/javascript" /> <title></title> </head> <body> <?php //データベースサーバ名の設定 $db_host = "aaa.com"; //ユーザ名の設定 $db_user = "user"; //パスワードの設定 $db_passwd = "pass"; //データベースサーバへの接続 $db = mysql_connect($db_host,$db_user,$db_passwd); //データベース名の設定 $db_name = "db"; //データベースの選択 mysql_select_db($db_name,$db); //SQL文の設定 $str_sql = "select * from person"; //SQL文の実行 $rs = mysql_query($str_sql,$db); //結果セット内の各レコードを順次参照し、連想配列に代入 while($arr_item = mysql_fetch_assoc($rs)) { //レコード内の各フィールド名と値を順次参照 foreach($arr_item as $key => $value) { //フィールド名と値を表示 print "[{$key}] = {$value}<br>\n"; } print "<br>\n"; } //データベースサーバへの接続の切断 mysql_close($db); ?> </body> </html> ------------------------------------------ わかる方いらっしゃいましたらご教授願います。

  • ACCESSのデータベースについて

    今回初めて質問します。 仕事で質問されたことがどうしてもわからないので質問します。 ある顧客のデータがACCESSでデータベース化されていて、 そのデータベースを東京にある本社のサーバにおいて地方にある支社から、 ACCESSで作ったフォームを使ってインターネット経由でDBの参照とレコードの更新、追加をするにはどのような方法があるのでしょうか? 今まで私なりに調べてみましたが"MYSQL"とか"ADO"を使うとかありましたが、 どの方法がよいのかわかりません。 何かいい方法があれば教えてください。 よろしくお願いいたします。

  • MySQLデータベースにcsvファイルインポートで、エラー

    csvファイルインポートで、エラー phpMyAdminからMySQLデータベースに、csvファイルのインポートを試みたところ、 「CSV 入力のフィールド数が不正です(行: 17)」と表示され、うまくいきません。 データベースの中を確認すると、60レコードのうち、15レコードまでは正常にインポートされています。 元のcsvファイルを確認しても、mysql側とフィールド数は一致しており、問題はないように見受けられました。 phpMyadminのバージョンが、2.6.1-pl3から 2.10.0.2に変わった後、上記の問題が発生するようになりました。 よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • この場合のデータベースの作り方 初心者です。

    PHPとMYSQLにて検索システムを作りたいのですが、http://www.nighkyaba.jp/cast/index このような場合、テーブルのレコードやフィールドの数、PrimeryKeyなどどのようにして作れば良いのでしょうか? 基本的には、検索する条件(地域・年齢等)の数だけ(ここでは10個程)フィールドをつくるという事なのでしょうか? また、データベースをサイトからではなく直接ファイルに記録するにはコマンドプロンプト以外に便利なフリーソフトはありますでしょうか? WEB制作の社員で、MYSQLは初心者です。何卒宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • 効率のよいテーブルにするには?

    PHPとMYSQLを使用して投票システムのようなものを作っています。 ひとつの投票タイトルにおいて同じIPアドレスからの二重投票を防ぐには、どのようなプログラムにすれば一番効率がいいのでしょうか? ・ 誰でもタイトルを作成できるため、タイトルは次々と増えていく。 ・ 一度、あるタイトルに投票したIPアドレスでは、2度と同じタイトルに投票できない。 (他のタイトルになら投票できる) ・ 会員制ではなく、誰でも自由に投票することができる。 とりあえず方法を考えてみたのですが、投票ごとにレコードが増えていくため、後々、IPアドレス確認時に重くならないか心配です。 これで大丈夫か、それとも、もっと効率のいい方法があれば教えてください。 [ データベース ] テーブル = sample タイトルID = id IPアドレス = ip [ PHP ] タイトルID = $title  $db = mysql_connect("LOCALHOST","root",""); // データベース接続  $adress = getenv("REMOTE_ADDR"); // IPアドレス取得  // IPアドレス確認  $sql = " SELECT count(*) as hoge FROM sample WHERE id='$title' and ip='$adress'";  $result = mysql_query($sql,$db);  $count = mysql_fetch_array($result); if($count[hoge] == 0){    // 投票プログラム     ( 省略)       // IPをテーブルに登録    $sql = "INSERT INTO sample(id,ip) VALUES('$title','$adress')";    $result = mysql_query($sql,$db); } else{print"二重投稿です。";}