質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

サーバ

サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

Q&A

3回答

4668閲覧

MySQL、大きいデータの扱いなどについて

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

サーバ

サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

2グッド

3クリップ

投稿2015/12/12 01:18

Webサイトを作成できるCMSのようなWebサービスを作ろうと思っています。
Wordpressのようにユーザーが自分のサーバーにインストールするのではなく、Webサービス上でサイトを作って生成したhtmlをユーザーがダウンロードしたり自分のサーバーにFTP転送できるというサービスです。

すでにPHP+MySQLで作っているのですが、いろいろ悩んでいるのでアドバイス頂けたらと思います。

仕組みは単純で、ユーザーがWebサービス上で作ったサイトの内容をデータベースに格納します。
格納するデータは「文章」「css」です。画像はファイルとしてサーバーに別途保存しようと思っています。

質問1.

サイトを作成する場合、ユーザーによって文章の長さが全然違います。本当に長い文章を書く人はかなり長いですし、thmlタグを多用すると一気に文字数が増えます。例えば、「今日は晴れですね」(8文字)でもタグ入りだと「今日は<span style='font-size:15px;color:#f00;font-weight:bold'>晴れ</span>ですね」(73文字)というように文字数が膨大になります。

この場合、テーブルの行のデータ型をvarcharで最大長の65,535を指定すべきでしょうか?それとも何か工夫が必要になるのでしょうか?

質問2.

ユーザーが作る一つのサイト(最大20ページまで作れるとします)でもそれなりに膨大なデータ量になる気がします。
質問1で書いたようにとにかく文字数が多くなるのが予想されます。そうするとテーブルサイズが一気に増えると思うのですが、このような場合はユーザー数毎にテーブルを別けるような設計が必要でしょうか?例えば100人ユーザー
がいたとして1~20までのユーザーはtb_data_1, 21~40までのユーザーはtb_data_2, ...のような感じです。
ユーザーxデータ量が膨大な場合はテーブル別けかパーティション設定を検討すべきでしょうか?

質問3.

Webサービス上で作ったサイトをhtmlに生成し、ユーザー自身のサーバーにこちらのサーバーからFTPで転送します。
ここでネックになるのが画像も一緒に転送するので、多くのユーザーが多くのサイトを自身のサーバーに転送しまくるとこちらが借りたサーバーの転送量制限にひっかかるのではないか、という懸念があります。
もちろんWebサービスとして転送回数などの制限を入れればいいとは思うのですが、ユーザーが増えていったときにどう対処すればいいのか何か良いアイデアなどがあればお教えください。

どうぞよろしくお願い致します。

mi-s.322, ikuwow👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

質問1ですが、VARCHARよりもっと長さの取れる型としてTEXTがあります。MEDIUMTEXTであれば、16メガバイトまで入りますので、足りなくなる心配はないでしょう(MySQLマニュアル)。また、これらの列は可変長ですので、1バイトしか入れなければ、1バイト+長さ自体を入れるためのの数バイトしか消費しません。

質問2ですが、基本的に同じデータを別テーブルに分けたりはしません。数百万件になってサーバが耐え切れないという状況になれば何かしらを考える必要はありますが、そうでもなければ1本のテーブルで大丈夫です。

質問3ですが、転送量無制限というサービスもありますので、プロキシ的にそういうところを経由させて課金を節約するのもありかもしれません。

投稿2015/12/12 01:34

maisumakun

総合スコア145064

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/12/12 02:19

早速のご回答ありがとうございます! 質問1につて、TEXTが適しているのですね。文字列ならvarcharだと勝手に思ってしまっていました…。きちんとマニュアルを見るようにさせて頂きます。 質問2について、テーブルが大きくなることでアクセス速度が遅くなったり不安がありましたが、まずは一つのテーブルでやってみようと思います。 質問3について、サーバーをどこで借りるかなどにもよるのでしょうか? 以前はシックスコアのマネージドサーバーを借りていましたが高スペックすぎて高かったのと再販不可なので使用をやめました。 いちおうVPSをどこかで借りようかとは考えています。 すみませんがプロキシ的にそういうところを経由させるという部分をもう少し詳しくご説明いただけたら嬉しいです。 どうぞよろしくお願い致します。
guest

0

その仕様であれば、テキスト保存&そのファイルパスの紐付けの方が良いと思います。
都度HTML化して転送するよりも、最初からファイル化して置いて置いたほうが良いのではないでしょうか。
転送ボタンを連打されるとそれだけファイル化しなければならないのではいかという心配ですね。

2)利用者が1年で10000人づつ増え、その人達が平均して10枚のページを作成するとします。
10000*10=100000レコードです。5年間運用したとして、500000レコードです。
この程度ならばよほど作りを悪くしない限り性能に影響は出ないでしょう。
パーティショニングが出来る設計にしておくに越したことはありません。
あと、頻繁に更新されるとOPTIMIZEしたりしないとダメかも。

3)テキストのFTP送信と画像のFTP送信を分けます。
画像の転送は一時間に1回等の制限を付けたほうが良いでしょう。

あるいは、いっそサービスの内容として「夜間バッチでFTPの自動送信」にしてしまっても良いでしょう。
ユーザーが任意で行えるのはファイルのダウンロードのみとし、FTP自動転送は自動化するのです。
自動送信の利点は「画像ファイルは差分のみ」とできることです。
「前回とファイルの差分がなければ送信しない」が出来るので、負荷は減らせます。
毎日画像を10000枚更新されるというような状況でもない限り、有効です。


個人的にはとても面白い試みのサービスなので、
そのパフォーマンス等の結果を共有してもらえると、非常に助かるものです。
実際、TEXTで頻繁に更新が発生する場合のデフラグメンテーションとか、すごい気になるので。
(実サービスでやってみろって言われても怖くて提案出来ないのです)

投稿2015/12/13 05:23

anonymouskawa

総合スコア856

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/12/13 11:03

ありがとうございます! 質問1について、たしかにファイル化したほうがいいのかもしれませんね。データベースと悩むところですが検討してみたいと思います。 質問2について、行数的には問題なさそうで安心しました。文字数が非常に多いのでテーブルのメモリサイズはけっこう大きくなりそうな気もしますが、そうなったら再検討すればいいですしね。 データは頻繁に更新されますのでOPTIMIZEは必要かもしれません。毎日早朝にテーブルを新規で作ってコピーしようかとも思っています。 質問3について、やはり画像の転送は制限を入れたほうがいいですよね。FTPでファイルの差分をチェックする方法はまだ確立していませんが作るときに別途こちらでご相談させていただくかもしれません。 最後の件ですが、巷にはたくさんサイトを制作するWebツールがありますので、そちらとは競合しないようなツールを作る予定です。それと私一人で開発しますのでそれほど大勢には使ってもらわない予定です。というのもそんなに大勢で使える堅牢なシステムが作れるか自信がないためです。ただいろいろ勉強にはなると思って頑張っていこうと思いますので何かありましたら質問と共に結果も報告させていただくかもしれません。 デフラグメンテーションについては先程も書きましたようにテーブルごとCRONで早朝にコピーしようと考えていますのでちょっとご報告できるかわからないです・・・。
guest

0

質問1

その場合はVARCCHRよりもTEXT系(TEXT,MEDIUMTEXT,LONGTEXT)の方が適しているかと思います。
DBへの負荷が大きくなると考えられるので、想定する負荷に応じて適当な文字数制限を加えるか、
、本当に無制限文字数が必要なら本文はファイルで保存して紐づけだけDBで行うという方法もあります。

質問2

ユーザ毎にテーブルを分けるような設計は普通はしません。
パーティショニングは検討の余地がありますが、例えば100人程度のユーザなら確実に必要ありません。
多量のレコード(数千万単位)が最初から確実に見込まれるのであればパーティショニングしましょう。

質問3

転送量制限はお金で解決出来ることなので基本的には
収益 > 転送にかかるコスト
となるように収益構造を設計するのが前提です。

そして、転送量制限に問題の無い環境を用意しましょう(規模の大小はありますが、VPSや専用サーバは通常は[価格に見合った常識的な範囲では]転送量の制限はありません。自宅やデータセンターにサーバを置いて、専用のネットワークを引いてもいいでしょう)

安価/無料だが転送量制限があるようなレンタルサーバを使う場合は、山ほど契約して処理を分散させるなどすれば可能ですが、ちゃんと設計/運用するのはとてもとても大変です。

FTP的な機能が無ければ(ユーザはダウンロード出来るだけ)適当なCDNやAmazonS3の様なサービスを使えば問題が無いのですが。

投稿2015/12/12 01:51

tanat

総合スコア18706

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/12/12 02:28

早速ご回答頂きましてありがとうございます! 質問1について、いろいろな方法がありますね。データベースなので無制限ということはしないようには考えていますが、TEXT系にしてみたいと思います。 質問2について、100人のユーザーが3000ページを作っても100*3000=30万レコードですから全然気にしなくてよいかもしれませんね。 質問3について、VPSを検討しています。以前はシックスコアのマネージドサーバーを借りていましたが、高かったのと、同時利用人数が30人くらいしかいなくて高スペックすぎたかもしれません。 レンタルサーバーを複数台利用・・・画像を複数台のサーバーに置くという感じなのですね。運用が大変そうですがそういうのもアリなのかもしれませんね。 いちおうFTP機能は必須という前提で作っていきたいと思います。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問