大量の会員データを効率的に処理する方法は?

このQ&Aのポイント
  • 大量の会員データを効率的に処理するための方法として、テーブルの分割が考えられます。
  • 具体的には、50万人ごとにテーブルを新たに作り、データを格納することで、クエリの実行時間を短縮し負荷を軽減することができます。
  • 大手会員制サイトでは、このようなデータの分割やインデックスの最適化などを行い、効率的に会員データを格納しています。
回答を見る
  • ベストアンサー

レコード数が増えすぎた場合の対処

例えば極端な例ですが、5000万人の会員のデータがmemberテーブルに入っていた場合 5000万行の中から特定の会員のレコードを探すのは時間が掛かると思うので select * from member where user_id = $user_id; 50万人ごとにテーブルを新たに作ってデータを格納した方がクエリの実行時間も早くなり負荷軽減に繋がるといえますでしょうか? user_idが1~50万は テーブルmember_1 $table = member_1; user_idが50万~100万は テーブルmember_2 $table = member_2; select * from $table where user_id = $user_id; 大手会員制サイトは、膨大な会員データをどのように格納しているのでしょうか。 ご教示頂けると幸いです。 宜しくお願い致します。

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

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

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

エンジンをMyISAMにしてインデックスをはればidからヒットさせるだけの 単純な検索なら気になる遅さにはならないと思います 複雑で速さが必要ならオラクルなど商用のDBをつかってください

phpmysql
質問者

お礼

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

その他の回答 (1)

  • singlecat
  • ベストアンサー率33% (139/418)
回答No.1

設計上Indexを元に検索するようにしますので、データが多くてもこの手の検索は一瞬です。

phpmysql
質問者

お礼

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

関連するQ&A

  • select されたレコードの操作

    以下のようなuser_idとuser_pwのtableがあります。 |id(ai)|user_id|user_pw|flg| |1|AAA|111|0| |2|BBB|222|0| select id from table where user_id = AAA をされると 1 を返し、 update table set flg = 1 where id = 1 かまたは update table set flg = 1 where user_id = AAA を発行したいと思っています。 ただ、sql 発行元から2個のsqlを出せない事情があり、DB側で対応しなければなりません。 トリガはselectでは使えませんよね?  最悪、query_logを監視しながらselectが来たら自分でupdateを発行するスクリプト しかないのかと考えています。 アドバイスお願いします。

  • TABLE内の行をランダムに半減させたい。

    あるテーブル(table)の行をランダムに半減させたいと思っています。 このテーブルのキーは、instance_idとuser_idです。 つまり、同一userが複数のinstanceを持ち、同一のinstanceが複数のuserに所持されうるというテーブル構成になっています、 今、行数は200あるとしますと、 delete from table where insance_id IN (select insance_id from table order by random() limit 100) としますと、tableの行が半減するわけではなく、同一instanceが複数userに所持されますので、もっと行数が減ってしまいます。 そこで、 # delete from table where instance_id AND user_id IN (select instance_id , user_id from table order by random() limit 100); というようなことをしたのですが、 ERROR: subquery has too many columns と出てしまいます。 2時間ほど、Webで調べて頑張ったのですが、よくわからないので、 これを実現するSQL文をお教えいただけませんか。 どうか、よろしくお願いいたします。

  • 1レコードのデータを複数行に分け通し番号を付ける

    Access2010にて、1レコードのデータを複数行に分け、追番毎に通し番号を付ける方法がわからず困っています。 テーブル1の様に、1レコードにはデータ格納するカラムが4つしかなく、同じ追番でデータが5個以上ある場合は、次のレコードに同じ追番を入力して5個目以降のデータを格納しているテーブルがあります。 テーブル1 追番 カラム1 カラム2 カラム3 カラム4 1 データ1 2 データ1 データ2 データ3 データ4 2 データ5 データ6 データ7 3 データ1 4 データ1 ・ ・ ・ これをテーブル2の様に1レコードにデータ1個づつ格納し、追番毎の番号を振りたいと思います。 テーブル2 追番 番号 データ 1 1 データ1 2 1 データ1 2 2 データ2 2 3 データ3 2 4 データ4 2 5 データ5 2 6 データ6 2 7 データ7 3 1 データ1 4 1 データ1 ・ ・ ・ クエリ1の様なユニオンクエリで近いかたち(テーブル3)にできたのですが、同じ追番で番号が1~4まで埋まったら、5以降の番号を降る方法が分かりません。 クエリ1 SELECT 追番, 1 AS 番号, カラム1 AS データ FROM テーブル1 WHERE カラム1 Is Not Null UNION ALL SELECT 追番, 2 AS 番号, カラム2 AS データ FROM テーブル1 WHERE カラム2 Is Not Null UNION ALL SELECT 追番, 3 AS 番号, カラム3 AS データ FROM テーブル1 WHERE カラム3 Is Not Null UNION ALL SELECT 追番, 4 AS 番号, カラム4 AS データ FROM テーブル1 WHERE カラム4 Is Not Null; テーブル3 追番 番号 データ 1 1 データ1 2 1 データ1 2 1 データ5 2 2 データ2 2 2 データ6 2 3 データ3 2 3 データ7 2 4 データ4 3 1 データ1 4 1 データ1 ・ ・ ・ よろしくお願いします。

  • PASSWORD関数

    INSERT INTO user_table(id,pass) VALUES ('abc',PASSWORD('123'); で入力したデータを以下のSELECT文で抽出しようとした処、クエリー発行は成功するものの、結果行数(mysql_num_rows)が0となります。 SELECT * FROM user_table WHERE pass=PASSWORD('123'); どうぞご教授ください。

    • ベストアンサー
    • MySQL
  • SELECT文の二段重ね

    次のSQL文を実行します。 create table1 (id, english) insert table1 (1,"foo") insert table1 (2,"bar") create table2 (id, japanese) insert table2 (1, "ふー") insert table2 (2, "ばー") SQL文法としては誤ってますが、成功したとします。 いま、select id from table1 where english = 'foo'; で1が得られます。 いま、select japanese from table2 where id = 1; で"ふー"が得られます。 これを一つのSQLite3のselect文で実現できないでしょうか。 select japanese from table2 where id = (select id from table1 where english = 'foo'); で良いですか? カテゴリ選択にSQLiteが無いのは、人気が無いからですかね。

  • SQL 表の結合

    SQLで2つの表から条件に合ったデータを取り出し、同じ列に表示させたいのですが、 どうやっても外部結合のようにすることしかできませんでした。 取り出したデータを縦に結合?させることはできるのでしょうか? 例) dataは月の上旬中旬下旬でそれぞれabcとします。 入力値はmonthとdayで、これらからuriageを選択します。 dataの取りうる値はa,b,c,ab,bc,abcとします。    table:A 売上表            table:B 上旬中旬下旬判断 ---------------------------   -----------  key | data | month | uriage   day | data ---------------------------    -----------   1 |  a  |  1  |  500      1 |  a   2 |  ab  |  1  |  800     … |  …   3 |  bc  |  1  |  400     10 |  a   4 |  c  |  1  |  100     11 |  b   5 |  abc |  1  |  900     … |  …   … |  …  |  …  | …     31 |  c ---------------------------    ----------- month = 1 , day =5のとき  table:Bより   SELECT data FROM table:B WHERE day = 5 としてdata "a" を得ます。 この"a"と同じdataを持つuriageを表示させたいので   SELECT uriage FROM table:A   WHERE month = 1 AND data = (SELECT data FROM table:B WHERE day = 5) として  table:query1  --------    uriage  --------    500  -------- を得ました。 ここまでは良いのですが、これに付け加えて、 table:Bから取り出したdata "a"をtable:Aのdataが含むとき(data = a,ab,abcのとき) その全てのuriageを表示させたく、 ワイルドカードを使おうと   SELECT uriage FROM table:A   WHERE month = 1 AND data = %(SELECT data FROM table:B WHERE day = 5)% 等としてみたのですが、上手くいきませんでした。 そこで、別のクエリーを作って   SELECT uriage FROM table:A   WHERE month = 1 AND data = 'ab' AND data = 'abc' として  table:query2  ---------   uriage  ---------    800  ---------    900  ---------- を得ました。 そして、最後に、 得られた2つの表をまとめて  ---------   uriage  ---------    500  ---------    800  ---------    900  --------- としたいのですが、   SELECT uriage, uriage FROM query1, query2 とすると  ------------------   uriage | uriage  ------------------    500  |  800    500  |  900  ------------------ となりますし、UNIONは使い方がよくわからないためシンタックスエラーにしかならず...。 そもそも、縦に結合?はできるのでしょうか??? あれこれ試してみたのですが、詰まってしまったので、 どなたか知恵をお貸しください。

  • phpmyadminのリレーション

    SELECT * FROM table1,table2 WHERE table1.id=table2.data_id; phpmyadminにて、上記のようなSQL文を実行してtable1とtable2のデータを リレーションにより表示します。 この時に表示した内容のテーブルを新規作成するにはどうすれば良いでしょうか?

    • ベストアンサー
    • MySQL
  • まったく別のテーブルの結果MYSQL

    table_1 id name age table_2 id book title city day SELECT * FROM table_1 WHERE id=? SELECT book,title FROM table_2 WHERE city=? このようにまったく別のテーブル カラム数も違う WHEREの?も違う これを一つのSQL文にまとめたいのですが。 UNIONなどを使ってもうまくいきませんでした。 ご教授お願いいたします。

    • ベストアンサー
    • MySQL
  • 同じテーブルでのUNION

    テーブルtableである列aのデータが1,2,3,4,5,6,7,8,9と 入っていたとします。 このテーブルを1,2,5,3,4,6,7,8,9という順番で SELECTしたい場合はどのようにすればよろしいでしょうか? select a from table where a IN (1,2) union select a from table where a = 5 union select a from table where a NOT IN (1,2,5) としてみたのですが1,2,3,4,5,6,7,8,9と表示されてしまいます。 宜しくお願いいたします。

  • 重複レコードを高速で取得するSQL

    Access(mdb)から約2万件レコードのあるテーブルがあるとします。 列数は20ほど。 その中から、3つの列において重複しているレコードを取得したいのですが、 高速に取得する方法はありますでしょうか? (VB.NETで、重複レコードをユーザーに示す処理を作成したいのです) 以下のSQLを試したところ、1分以上時間がかかってしまいました。 ----------------------------- SELECT * FROM テーブルA table1 WHERE EXISTS ( SELECT * FROM テーブルA table2 WHERE table1.列A = table2.列A   table1.列B = table2.列B   table1.列C = table2.列C GROUP BY table2.列A HAVING COUNT(table2.列A) > 1 ) ----------------------------- アドバイスをお願いします。