• 締切済み

行数について

MySQLバージョン4.1.16を使用しています。 例えば、1ユーザごとに平均1000行を持たせるテーブルがあったとしたら それは良くない構造なのでしょうか? 1ユーザで1000なので、仮に1万ユーザ居たとしたらそれだけで 1万×1000=1000万行なので、恐らく駄目ですよね・・・(100行ぐらいなら許容範囲なのかな??) そういう場合、プログラム側で工夫するしかないのでしょうか? いきなり1000行を1行に纏めるは難しいと思いますが、 1つのカラムに('aaaa',11,'ああああ')と「,(カンマ)」で区切って入れるやり方や、 それともカラムの数を増やすやり方とか、どのような方法が良いのでしょうか?

みんなの回答

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

単純に行数ですべてのスピードがきまるほどSQLは単純な構造ではありません。 データが大きくなればそれにみあったチューニングがあります。 もちろん質の問題はあります、無駄なデータが1000行あって効率化できるなら パフォーマンスはかなりかわってくるでしょう。 カンマ区切りで一つのカラムにする・・・SQLの性質から言ってこれでは 早くならない。そんなことするくらいなら、1000行あった方がましだと 思います。 とにかく「正規化」など学習して、データの効率的な持ち方を研究する ことです。

takagoo100
質問者

お礼

ご返答ありがとうございます。 もちろん正規化は自分なりに勉強したつもりですが(このような構造になってしまっては 理解してないことと同じかもしれませんが・・・) こちらとしては、何百何千万というレコードを扱ったことがない(当然ですが)ので このような1ユーザに1000行も持たせる構造が、 あまり良くないことだけども存在してもいいのかな?というのが疑問で、 yambejpさんの仰る、 >そんなことするくらいなら、1000行あった方がましだと思います。 というのを、そのままの意味で「そんな酷いことをするぐらいなら、そちらの方がまし」 と受けとめたのですが、1ユーザに1000行も持たせるというか、 そのようなアプリケーションは実際にあって、このインターネットにおいてどこかで 運用されている例などはあるのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 別テーブルの行数を利用してソートしたい

    MySQLバージョン4.1.16を使用しています。 テーブル「tbl1」をテーブル「tbl2」の「msg」カラムの行数を利用して ソートしたいのですが、どのようなSQL文になるのでしょうか? 以下の例だと、tbl2のuser_idがbbbbのmsg数の方が多いので descで並べるとtbl1はbbbb、aaaaの順になるようにしたいです。 テーブル「tbl1」 +----------+ | user_id   | +----------+ |  aaaa   | +----------+ |  bbbb   | +----------+ テーブル「tbl2」 +----------+---------+ |  user_id  |  msg  | +----------+---------+ |  bbbb   |  ああ  | +----------+---------+ |  aaaa   |  いい  | +----------+---------+ |  bbbb   |  うう   | +----------+---------+ SELECT * FROM tbl1 INNER JOIN tbl2 ON tbl1.user_id = tbl2.user_id ORDER BY (ここの部分が知りたいです、または全く違う文になるのでしょうか?) desc

    • ベストアンサー
    • MySQL
  • 一度に関連する他のテーブルの行も取得したい

    MySQLバージョン4.1.16を使用しています。 ちょっとPHPも絡んでくるのですが、こちらのジャンルでお願いします。 テーブル「items」はテーブル「users」のuser_idカラムを 外部キーとして持っています。ここで「users」テーブルの行を取得して、 その値(user_idのaaaaやbbbbなど)を利用して 「items」テーブルのそれぞれ対応する行を取得したいのですが、 $users = (usersテーブルの行を取得するSQL文); $index = 0; foreach ($users as $row) { $users[$index]['items'] = (user_idに対応したitemsテーブルの行を取得するSQL文); $index++; } print_r($users); /* Array (  [0] => Array   (    [user_id] => aaaa    [items] => Array     (      [0] => Array       (        [user_id] => aaaa        [item_name] => アイテム1       )      [1] => Array       (        [user_id] => aaaa        [item_name] => アイテム2       )     )   )  [1] => Array   (    [user_id] => bbbb    [items] => Array     (      [0] => Array       (        [user_id] => bbbb        [item_name] => アイテム3       )     )   ) ) */ と、このように2段階に分けてやれば取得できるのですが、 そうではなくてこれを一度に取得できるSQL文というかやり方はあるのでしょうか? $users = (usersテーブルの行を取得するSQL文);←この段階でそれぞれ対応してるitemsテーブルの行まで取得したい

  • 同じテーブル内同士で更新したい

    MySQLバージョン4.1.16を使用しています。 同じテーブル内で、user_idが「aaaa」のnumカラム値を 「bbbb」のnumカラム値でupdateしたいのですが、 次のようなsqlだとエラーが出てしまいます・・・ なんとかしてできる方法はないでしょうか? $sql = "UPDATE users SET num = (SELECT num FROM users WHERE user_id = 'bbbb') WHERE user_id = 'aaaa'"; Error Number: 1093 You can't specify target table 'users' for update in FROM clause テーブル「users」 +----------+---------+ |  user_id  |  num  | +----------+---------+ |  aaaa   |   1   |←成功すれば2になる +----------+---------+ |  bbbb   |   2   | +----------+---------+

  • 優先順位を決めて、そこからランダムに選んでいく方法

    MySQLバージョン4.1.16を使用しています。 次のような、priority(1が最も優先順位が高い)を カラムに持つテーブル「users」で、flagが1を条件として priorityが1から順番にランダムに1つだけ選びたいのです。 つまりこの場合、初めは priorityが1の「bbbb」行と「dddd」行からランダムに選ぶのですが、 flagが共に0なので条件に合わないので選ぶことはできません。 次に、priorityが2の「cccc」「eeee」「ffff」行のflagを調べて flagが1の「cccc」「ffff」行の2つからランダムに選ぶことになります。 このようなSQL文はどのような記述になるのでしょうか? テーブル「users」 +----------+---------+---------+ |  user_id  | priority |   flag  | +----------+---------+---------+ |  aaaa   |   3   |   1   | +----------+---------+---------+ |  bbbb   |   1   |   0   | +----------+---------+---------+ |  cccc   |   2   |   1   | +----------+---------+---------+ |  dddd   |   1   |   0   | +----------+---------+---------+ |  eeee   |   2   |   0   | +----------+---------+---------+ |  ffff    |   2   |   1   | +----------+---------+---------+

    • ベストアンサー
    • MySQL
  • 得られたカラムを利用して複数行を1文で取得したい

    MySQLバージョン4.1.16を使用しています。 テーブル「tbl1」のnoが2が保有しているuser_id(この場合はaaaa) の行を1つのSQL文で取得したいのですが、どのようなSQL文なるでしょうか? 例えばこの場合は1,2,4行目が取得できるようにしたいです。 また、PHPなどを利用して記述する場合に、 一旦、 select * from tbl1 where no = '2'; で得られたuser_id(aaaa)を変数に保存しておき、 それを利用してもう一度 select * from tbl1 where user_id = '{上のSQL文で得られた変数(中身はaaaa)}'; と二度記述してもできるのでしょうが、 初めの1つのSQL文で取得する場合と、2つのSQL文わけて取得する場合とでは 件数が多くなっていった時にどちらが早い遅いというのはあるのでしょうか? テーブル「tbl1」 +----------+---------+ |  user_id  |  no   | +----------+---------+ |  aaaa   |   1   | +----------+---------+ |  aaaa   |   2   | +----------+---------+ |  bbbb   |   3   | +----------+---------+ |  aaaa   |   4   | +----------+---------+

    • ベストアンサー
    • MySQL
  • MySQL テーブルの結合

    顧客ごとにテーブルを作る香ばしいプログラムのSQL文を書くことになりました。 user_0001 user_0002 user_0003 user_0004 user_0005 といった具合にどんどん増えていきます。 カラムは仮に id, name, tel が入っているとします。 プログラムの修正は行えません。 通常JOIN句でテーブルの結合を行うと思うのですが、「user_」という文字列を含んでいるテーブルを全て結合せよ!みたいな命令文はSQLで書けるのでしょうか? 無理、無駄、素直にプログラムで出せ、というアドバイスでも構いませんのでよろしくお願いします。

    • ベストアンサー
    • MySQL
  • T-SQL 動的に優先順ごとにデータを抽出する方法

    テーブル"t_table"にカラム"col1","col2"が有り、以下の ようにデータが登録されていると仮定して |col1|col2| --------- |aaaa|00gg| |aaaa|00dd| |aaaa|00ff| の場合は行"|aaaa|00ff|"のみ抽出。 |col1|col2| --------- |aaaa|00gg| |aaaa|00dd| の場合は行"|aaaa|00gg|"のみ抽出。 |col1|col2| --------- |aaaa|00dd| の場合は行"|aaaa|00dd|"のみ抽出。 ここで優先順の基準になるのはカラム"col2"に 登録されているデータであり、その優先順は 1.00ff 2.00gg 3.00dd です。 上記のように優先順による抽出はどのようなSQL を組めば実現できるのでしょうか?

  • csvファイルを使ってMySQLのテーブルを更新し

    約2万件ある15個のカラムで構成されるMySQLのテーブルがあります。 このテーブルをcsvファイルを使って更新しようと考えています。 csvファイルにはレコードIDとあるカラムの変更する値の2つのセルで 構成されています。 行数は毎回異なりますが、だいたい300行前後です。 csvファイルの具体的イメージはこんな感じです。 id order ============ 2,  200 4,  10 7,  460 11,  35 MySQLのテーブルの方にも「id」と「order」というカラムが存在します。 java や PHP を使ってやる方法はわかるんですが、プログラムを作成しないで SQLだけで行いたいと考えています。 LOAD DATA LOCAL INFILE などがあることがわかったのですが、レコードを REPLACE  するのではなく、一部のカラムをアップデートしたい、ということです。 どなたか、教えて頂けると助かります。 よろしくお願い致します。

  • フレンドリストのようなものを作る場合の設計

    かなり初心者です。もしかしたら妙な事を訊いているのかもしれません。 php5.4.16とmysql5.5.32でSNSのフレンドリストのような機能を作ろうと思います。 フレンド最大数は1000とします。この場合、1000個もカラムを作るのでしょうか? それとも、会員個別にテーブルを作ってそこで管理するのでしょうか。 もしくは、テーブルは一つとし、会員番号のカラムを二つ用意、関係性を示したテーブルを作るのでしょうか? もしくは、カラムは一個で文字列で操作したりするのでしょうか?(カンマで区切る等) パフォーマンス的にどの設計が正しくて、どの設計が間違いなのでしょうか… 回答よろしくお願いします。

    • ベストアンサー
    • MySQL
  • MySQLで行単位の和算はどうすれば良いですか?

    データベース・MySQLの初心者です。 もう一つ教えてください。 下のテーブルで、NO、数値、和算カラムがあります。 NOカラムの1、2の行の数値カラムを足し、 NOカラム2の和算カラムに、結果の3を入れます。 同じように、2行づつ和算を行なうには、どのようにSQL文を つくれば良いでしょうか? テーブル NO 数値 和算 和算カラムの結果 1  1   null  null 2  2   null  3 3  5   null  7 4  2   null  7 5  2   null  4 よろしくお願いします。

    • ベストアンサー
    • MySQL