• ベストアンサー

データ量が多すぎると、テーブルを分けたほうがいい?

質問があるのですが、よろしくお願いします。 例えば、ミクシーで、日記機能がありますが、もしミクシーがMySQLを使っているとしたら、あの日記に書き込まれるコメントのデータはどのようにテーブルに格納されているのでしょうか?? 一つのテーブルで済まそうとするとデータがかなり膨大になって検索に時間がかかるのではないかと思うのです。 例えばid1番からid100番までの日記のコメントのデータは、nikki_comment_100_tというテーブル、id101番からid200番までの日記のコメントのデータはnikki_comment_200_tというテーブル、というように、いくつかに分割して格納してたりするのでしょうか?それとも、一つのテーブルで十分事足りるのでしょうか?? また、もし前者のように分割して分けているとしても、それは顧客が多くデータが膨大なミクシーのような大規模なサイトならではのことで、これから人を集めようとしている現段階では小規模なサイトのデータベースなら、わざわざテーブルを分割してデータを格納することはない・・・とかそんな感じなのでしょうか? どなたか分かる方いらっしゃいましたら、よろしくお願いします。

  • MySQL
  • 回答数4
  • ありがとう数1

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

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

>データがかなり膨大になって検索に時間がかかるのでは 一般的にDBMSには、B-TREE形式などのインデクスが実装されており、データ量が増えたからといって、極端に性能が悪化することはない仕組みになっています。 >いくつかに分割して格納してたりするのでしょうか? テーブルを分割する目的は、以下のようなものです。 (1)テーブルの容量が、OSのファイルシステムの上限を超える。 (2)負荷分散 (3)デフラグなどの運用、障害発生時などで、システムの縮退運用を可能とする あなたが考えているのは、(1)ですが、そういった理由で分割するケースは、そう多くはないと思います。 一般的にはユーザidなどで接続するサーバを分け、接続ユーザ数が増えた場合でも、一定の性能を確保できるようにします。 また、デフラグなどの運用を行う場合、一つのテーブルに集約してしまっていると、一時的にサービスを全面停止しなければならなくなります。テーブルなどを分割しておくことで、いくつかのサービスを継続しながら、メンテナンスといった運用を行うことが可能になります。 小規模なシステムの場合は、当初は負荷分散などを行わず、接続ユーザ数の増加などを契機として、負荷分散させるといったことは、一般的に行われていることです。

その他の回答 (3)

回答No.4

#3回答者です。 文言を一部訂正します。 【変更前】 あなたが考えているのは、(1)ですが、そういった理由で分割するケースは、そう多くはないと思います。 【変更後】 データ量が多くなると(1)に該当するケースが出てきますが、そういった理由だけで分割するケースは、そう多くはないと思います。

miraikako
質問者

お礼

返事が異様に遅れてすいません。。 ご教授くださった方々ありがとうございました。 参考にさせていただきます。

  • galluda
  • ベストアンサー率35% (440/1242)
回答No.2

がると申します。 この手の話題は色々と個人差などもありますので、一つの参考意見として捉えていただければ。 まず「1テーブルのレコード件数が多い場合」ですが、確かにおっしゃるようなやり口は存在します。 ただ、いくつか条件があって。基本的には「情報が交わらない場合」ってのが概ね鉄則かと。 おっしゃられている例ですと、ユーザIDによって分割しているので。その場合「ユーザをまたいだ検索がない(若しくは非常にレアである)場合」なら、考慮すべき方向性であるかと思われます。 で、その場合。設計的には「n個のテーブルを用いる」設計にし、とりあえずnを1にして作成、後にnの数字をもちあげていきます。 で、この方向性をもっと持ち上げると「異なるDBサーバにデータを持つ」手法というのがありまして(物理的に「違う」サーバにデータを入れる)。 実際、これで実装したケースもあります。 こういった手法は別に愚の骨頂でもなんでもなくて。 状況次第では、十分に考えられうる方向性の一つかと思われます。 ただまぁ「一般的ではない」のは事実で、それにはそれなりの理由があるので。こういった方向性の設計の採用に関しては、特に丹念に考慮してしすぎることはない、とは思いますが。

  • 0KG00
  • ベストアンサー率36% (334/913)
回答No.1

件数が多いぐらいでテーブルを分けるのは愚の骨頂です。 件数が増えた場合にテーブルを追加した場合のプログラムの修正範囲が巨大になりすぎるかと。 大規模といってもせいぜい数千万件ぐらいですよね検索はデータベース側で色々な仕組みが備わっている場合が多いですので、件数が10倍になったからといって待ち時間が10倍にはならないです。 http://dev.mysql.com/doc/refman/4.1/ja/mysql-indexes.html http://www.daito.ac.jp/~ikeuchi/webdb/mysql_5.html 仮にMySQLだったとしたら、インデックスを使っているでしょうね。Oracleなら主キーにはインデックスは漏れなく作成されていましたが、MySQLはどうか解りません。

関連するQ&A

  • テーブルの使い方について。

    例えばミクシーのマイミクのようなデータは、どのようにデータベースに格納されているのでしょうか?? 以下の2つのパターンのいずれかだと思うのですが。。 パターン(1) マイミクのデータ専用のテーブルがある。 テーブル名 mymixi_t |-----------------| |USER_ID|MIMIXI_ID| |-----------------| |3   |6    | |-----------------| |512  |55    | |-----------------| |66   |6    | |-----------------| |3   |124   | |-----------------| パターン(2) ユーザープロフィールデータのテーブルの中にマイミクのカラムがある。 テーブル名 user_profile_t |-----------------| |USER_ID|USER_NAME|・・・|MYMIXI_ID| |-----------------|・・・|---------| |3   |A太   |・・・|86;48  | |-----------------|・・・|---------| |64   |B太   |・・・|32;45;678| |-----------------|・・・|---------| |1234  |C太   |・・・|8    | |-----------------|・・・|---------| |335  |D太   |・・・|11;14  | |-----------------|・・・|---------| 以上の2パターンのうち、どちらでしょうか?? また、MIXIではデータの量が膨大なため、同じ種類のデータが入るテーブルでも何個かにテーブルを分けている、とも聞いたのですが、これから人を集めようとするサイトならば、あまり気にせず、延々と縦長にデータを追加していって大丈夫なのでしょうか。どこらへんまでのデータ量なら、検索速度的に許容範囲なのでしょうか。 よろしくお願いします。 (仕様のせいか、テーブルの図がこれ以上見やすく書けませんでした。。)

    • ベストアンサー
    • MySQL
  • mysqlでSELECTの速度を上げる方法

    以下のようなSQLを発行すると、mysqlの処理時間が非常に多くかかるため、なんとか最適化を行いたいと考えています。 どのような方法があるのか教えていただけませんしょうか。 SELECT user_id,comment,comment_id,date,study_time,study,source FROM data_temp t1 WHERE NOT EXISTS (select comment_id from data t2 where t1.comment_id = t2.comment_id) ■補足 ・dataとdata_tempのテーブル構造は全く同じです。 ・SQLで実現したいことは、両テーブルのcomment_idをキーとして、dataに含まれないdata_tempの差分データを表示させたい。 なお、以下のインデックス作成は行いましたが、結果変わらずでした。 alter table data t1 ADD INDEX_t1 (user_id,comment,comment_id,date,study_time,study,source); alter table data_temp t1 ADD INDEX_t1 (user_id,comment,comment_id,date,study_time,study,source); よろしくお願いします。

    • ベストアンサー
    • MySQL
  • データを西暦ごとにテーブルに分けたい

    30万件ほどデータがあるテーブルtableがあります。 フィールドyearにそのデータが作成された西暦が4桁のint型で記されているのですが、 これを1年ごとに分割してテーブルを生成したいです。 ---------- table (id はオートインクリメント) id name year info 1 aaaa 2011 aaaaaaaa   2 bbbb 2012 bbbbbbbb 3 cccc 2010 ccccccc 4 dddd 2012  dddddddd 5 eeee 2011  eeeeeee : : ↓ table2010 id name year info 1 cccc 2010 ccccccc : : table2011 id name year info 1 aaaa 2011 aaaaaaaa 2 eeee 2011  eeeeeee : : table2012 id name year info 1 bbbb 2012 bbbbbbbb 2 dddd 2012  dddddddd : : ------------ データが数十件ならphpmyadminを駆使するのですが、今回はデータ量が多いこともあり、 これらを上手に分ける方法となると現在の私の力では難しいです。 このような形でテーブルを分割する方法を教えてください。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • フォームから2つのテーブルにデータを書き込みたい

    Accessで T_aテーブルとT_bテーブルがありそれぞれのフィールドが以下のようになっているとします。 T_a:フィールド名 データ型    ID  オートナンバー型    商品番号 テキスト型 主キー T_b:フィールド名 データ型    ID  オートナンバー型 主キー    商品番号 テキスト型 このときフォームから入力したデータをそれぞれのテーブルの商品番号に追加したいのですがどのようにすればよいのでしょうか。  よろしくお願いいたします。

  • 2つのテーブルからのデータ取得および件数の取得

    お世話になっております。 以前、何度か複数のテーブルからのデータ取得に関し、質問させて頂きましたが、スキルに乏しく、以下のような内容で躓いております。 アドバイスも含め、スクリプトなどのご指摘を頂戴出来れば幸いです。 お忙しい中恐縮ですが、宜しくお願いいたします。 TB:diary no id(*) date subject contents 1  4  2007-10-07 ・・・・・・ 2  8  2007-10-07 ・・・・・・ 3  3  2007-10-06 ・・・・・・ 4  5  2007-10-06 ・・・・・・ *投函者ID TB:diary_comment no diary_no ...... 1  2 2  4 3  8 4  1 diary_id とは、diary(TB)のno(auto_increment)を指しています。 以上、複数の人が登録できるブログサイトのようなものを作っており、ブログを書いている人の日記一覧を表示させたとき、各記事に対していくつのコメントの投函があるかを、日記の一覧と同時に表示させたく、diaryのnoと同一番号のdiary_comment(ブログに対して記述されたコメント)内のdiary_noをカウントしたく、以下のソースを設置してみましたが、これだとコメントのあるものしか表示されません。 先にも述べましたが、スキルに乏しく、この手の検索にソースコードそのものにも自信がなく、アドバイスのみならずご指摘いただければと考えておりますので、宜しくご指導のほどお願い申し上げます。 //MySQL 4.0 $sql = "select D.`no`, D.`id`, D.`date`, D.`subject`, D.`contents`, count(*) as `count` from `diary_comment` C inner join `diary` D on D.`no` = C.`diary_no` where D.`no` = C.`diary_no` AND D.`id` = '$fri_id' group by D.`no`, D.`id`, C.`diary_no` order by D.`date` desc LIMIT $st, $lim;"; //$fri_idは、diary.TBのidを呼び出すためのGETから渡されたもの。

    • ベストアンサー
    • MySQL
  • 複数のテーブルからのデータ抽出

    こんばんは。お世話になっております。 テーブル(A) id | no | image -------------------- 1 | みかん| aaa.gif 2 | なし | bbb.gif 3 | いちご| ccc.gif テーブル(B) m_id | t_id ---------------- 1  |  3 2  |  2 1  |  2 というようなテーブルがあるのですが、テーブルBのm_id、1を検索した際、t_idを抽出、かつそのt_idと同じ番号であるテーブルAのimageをも抽出したいと考えています。 結果としては、以下のような感じ。 3  ccc.gif 2  bbb.gif $m_id =$_GET["id"]; //途中省略 $sql= "select * FROM B INNER JOIN A ON B.m_id = A.id WHERE m_id = '$m_id'"; としているのですが、テーブルBのt_idは検索されるものの、テーブルAのimageは全てaaa.gifと返ってきてしまいます。 先日、こちらでテーブルの正規化として、データを分散させる考え方をお教え頂き、早速それに習って構成してみたのですが、思うようにデータを抽出出来ずにアドバイスを頂戴したく投函させていただきました。 先のソースで可笑しな点などの忠告や、アドバイスなど頂戴できれば幸いです。宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • エクセルからアクセスのテーブルにデータ追加したい

    Excel(xls)からAccess(mdb)のテーブル(出力)にデータを追加できるVBAコードを教えてください。 条件 Accessの名前と場所 C:\SP3\Print.mdb テーブル名 (出力) (履歴) テーブル構造 (出力) (履歴)ともに、フィールド1~4、ID 履歴テーブルのIDは、カウントアップであり、プリント後のデータが格納される。エクセルでマクロを起動したときに、最初に履歴テーブルの最後のIDを知り、エクセルの対応するID列をレコード分だけ最後のID+1から通番を付ける。通番を付けたら、エクセルのフィールド1~4とIDのレコードセットを出力テーブルの該当列に追加する。 以上がやりたいことです。 エクセルに、10行から100行程度のデータを貼りつけて、このVBAを紐づけたマクロボタンを押したら、履歴テーブルの最後を調べて、その次の番号から順に、上からID列を更新して、その後、出力テーブルに追加したいのです。 検査機器用に専用開発されたプリントソフトがデータベースにAccessを持っていて、プリントソフトのフロントからデータを手入力する仕様なのですが、エクセルで加工したデータをAccessの所定のテーブルに横差ししたい考えです。対象のPCには、Accessをインストールしていないため、エクセル側からテーブルを操作したい理由です。 よろしくお願いします。

  • mixi データのダウンロードとアップロード

    今、mixiで日記を書いています。 マイミクさんとのトラブルや、荒らされたりということがあったので IDを変えたいと思います。 でも、日記はそのまま新しいIDの方に移したいのですが、 移せるソフトはないでしょうか。 日記やメッセージのデータをダウンロードできるフリーソフトは いくつか見つけたのですが、 そのダウンロードしたデータを他のブログにはできても、 再びmixiに戻すことはできなさそうです。 mixiの日記をダウンロードし、再アップできるソフトはありませんでしょうか? お詳しい方、よろしくお願いします。

  • マスタテーブル使用時のデータテーブル設計について

    皆様こんにちは、失礼致します。 現在、ASP.NET+SQLServerで業務用帳票アプリの開発を行っています。 DBを使用した開発は初めてで、テーブルの設計手法について 経験者様のご指導を頂きたく、宜しくお願い致します。 まず、マスタテーブルは以下とします。 【顧客マスタテーブル】 ・顧客マスタID ・顧客名 ・顧客名(英語名) 帳票データ入力画面で、顧客マスタ検索ボタンから別画面を起動し、 そこで選択した顧客名を帳票データ入力画面に反映させます。 そして、帳票データ入力画面のデータをデータテーブルへ格納する のですが、その際には顧客名そのものか、マスタIDのどちらを 格納するのが好ましいのでしょうか? 要件としては以下を満たす必要があります。 1.帳票データ入力画面で格納したデータは   別の帳票データ入力画面でも使い回す。 2.帳票印刷時にのみ、顧客名を対応する顧客名(英語名)で   出力する。 3.データテーブルに格納されたデータは後々参照して使い回す。 顧客名で格納しておけば使い回しは楽ですが、2.のケースで 顧客名から顧客名(英語名)をselectした場合に、顧客名は一意でも 顧客名(英語名)が一意ではなかった場合に問題が起きます。 マスタIDで格納しておけば、対応する顧客名(英語名)は検索 できますが、マスタを修正した場合には3.で過去データを 参照する時に修正後のマスタ情報が表示されてしまいます。 結論としましては、両方とも格納しておくのが好ましいのでは、 と考えておりますが、メンテナンス性の観点から、データテーブルの カラム数はできるだけ少なくしたいとも考えております。 周囲に経験者がいなくて困っております。 ご指導頂けますと幸いです。 以上、宜しくお願い致します。

  • アクセスで連続データをテーブルとして作成したい

    IDを自動で作成したいのです。IDは「日付データ-固有番」とします。 1 日付データは3/1ですから40599ではじまり翌年の3/31の40999までとします。 2 固有番は001~040までです。 作成される形は「40599-001」で「40999-040」が最終データとなります。 400×40の16000のデータが必要です。 2つの連続データの組合せを作成する簡単なテーブル作成方法を教えてください。