• 締切済み

データの許容量について

環境 Linux Fedoracore 4/MySQL 4.1/Apache 2.0/PHP 5 いつもお世話になっております。 DB初心者です。 業務で管理しているDBについてですが、1つのテーブルあたり50万行を超えたあたりからパフォーマンス(SQL実行速度)が低下しているのが体感できるようになりました。Slowlogでも確認すみ。 テーブル自体は、アクセスログを保存するため、1アクセス1レコードのように追加しています。(構築すみで仕様の変更はできません。) そこで、下記の質問に対してご意見をいただければと思います。 1)MySQLのレコード数が、パフォーマンスに影響のある一定の桁数(僕のサーバでは50万行以上)に達した場合、レコードを消す以外に対処方はありますか? 2)現在のシステムは別として、数10万行にもデータを蓄積する場合、テーブルを分ける、マシンのスペックをあげるなどの具体的な設計思想や対策があれば教えてください。

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

みんなの回答

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

>50万行 まだそれほど大した量ではありませんね・・・ データ量に相対的にパフォーマンスは落ちますが、 集計方法にあわせた適切なインデックスを設定していますか? チューニングに関してはSQLの構文をEXPLAINで確認してみてください。 http://www.atmarkit.co.jp/fdb/rensai/orasql01/orasql01_2.html#4

SeafooD3
質問者

お礼

50万行は僕が思っているほど大きい数字ではないのですね。 経験が浅いため、わかりませんでした。 ご指摘のようにインデックスは設定しておりませんでした。 適宜設定すると、パフォーマンスが速度としては約2倍に向上しました。 ありがとうございます。もっと勉強していきます。

関連するQ&A

  • DB(MySQL)から複数行のデータを取り出す方法

    最近PHPを勉強していて、初歩的な質問で申し訳ないのですが どうしてもわからないので質問させていただきます。 例えば、MySQLに以下のようなデータがあります。   年齢 名前 性別   28  AAA  男   20  BBB  男   25  CCC  女 ここで男のレコードだけ取り出したいと思い 以下のようなコードを書きました。   //MySQLへデータを保存する。   mysql_connect("localhost","root","");   mysql_select_db("DB名");   //データの取得   $id = mysql_query("SELECT '年齢','名前','性別' FROM テーブル名 WHERE '性別' = '男'");   $array=mysql_fetch_row($id); この場合、2行のレコードが選ばれるはずですが 後ろのレコードへのアクセスの仕方がわかりません。 $arrayには性別=男に該当する、一行目のレコードが入っています。 二行目のレコードへはどうやってアクセスすればよいのでしょか? 調べてもなかなかうまくいかずご質問させていただきました。 ご回答お願いします。

    • ベストアンサー
    • PHP
  • データベースのデータ容量管理

    ミッションクリティカルなサイトでアクセス、エラーログをMySQLなどのDBで保存した場合、 どんどんデータが蓄積されていくかと思います。 古いDBデータを削除、あるいは退避(できるなら)したいと考えておりますが 一般的にどのように対応するものなのでしょうか? ご存知の方、宜しくお願いします。

  • MySQLのデータファイルの位置について

    MySQLでテーブル、データベースを作成したのですが、 OS上から作成したテーブル・データベースが保存されているファイル(データファイル?) が見つけられません。 テーブルにデータをインサートしてコミットして、 セレクトを行ってデータは反映されていることは確認しています。 OSはWindows 7 MySQLのバージョンは5.5です。 user_dbというデータベースを作成し、 show databasesを行った結果、 information_schema mysql performance_schema test user_db が表示されることから、データベースuser_dbは正常に作られていると思います、 user_dbに対して、インサートは可能で、一度データベースを停止して、 再起動後、インサートしたデータがみれています。 しかし、インストールフォルダのMy.iniのdatadirで指定されているフォルダには mysql performance_schema のフォルダしかない状態です。(ここにuser_dbフォルダが作成されると思うのですが) どこにデータが保存されているのでしょうか?

    • ベストアンサー
    • MySQL
  • ACCESSからリンクでのレコードの追加

    XP&MySQL5&ACCESS2003&MyODBC3.51 MySQLのDBをODBCに登録→ACCESSからリンク しています。 リンクテーブルからレコードの追加ができません。 ご存知の方おられたら、教えてください。

    • ベストアンサー
    • MySQL
  • サーバ負荷を考慮した処理

    apache2, PHP4.1, MySQL4でECサイトを構築しています。OSはLinux。 注文情報をMySQLのテーブルに格納した後、MySQL以外にも別にDBが存在しており、そちらにも同時にXML形式で渡して格納しています。 しかし負荷が上がると別DBへのアクセスがボトルネックになっているようで、ECサイト側のLoad Averageが高くなっているところまで判明しました。 MySQLと別DBは完全同期でなくてもかまわないので、できれば、ブラウザのアクセスとは切り離した形で、テーブル内の情報を別DBにポツポツアップしていきたいのですが、どのようなやり方が最適でしょうか。

  • 同時書き込み

    mysqlを使おうと勉強中です mysqlに同時書き込みした場合についての質問です 例えば,5人のユーザーが同時に書き込んだとします。書き込むレコードは全て違います ユーザー1がレコード1行目に書き込み ユーザー2がレコード2行目に書き込み ユーザー3がレコード3行目に書き込み ユーザー4がレコード4行目に書き込み ユーザー5がレコード5行目に書き込み この場合は、普通のtableで処理できますか?

    • ベストアンサー
    • MySQL
  • MySQLをアクセスログとして使う場合について

    宜しくお願い致します。 MySQLのDBでアクセスログを取りたいと思っております。が、MySQLのDBに一度にアクセスできる人数と記録できるレコード数に限界ってあるんでしょうか?一日に数万アクセスあった場合、無条件に全て記録したら、一日で数万レコードになってしまうし、一度にアクセスが重複する数もかなりの数になると思います。かなり心配になってしまいました。。。

    • ベストアンサー
    • MySQL
  • PHP+MySQLでの排他処理とDBクローズ

    <環境> Apache1.3.37 PHP4.4.6 MySQL4.0.27 PHPで、掲示板などのスクリプト作成を勉強しています。 これまで、ログをログファイルとして保存するように作成しておりましたが、データベースに保存するように変更している途中です。 そこで、教えていただきたいのは下記の2点です。 ・ロック処理の必要性 →ログファイルを作成するタイプの場合、同時アクセスによるファイル破損を防ぐため、ロック処理が必要でした。DBに変更した場合も同様に必要なのでしょうか? ・DBのクローズ処理 →最小限のソースを以下に記します。9行目のクローズ処理は必ず必要でしょうか?また、エラーが発生した場合、7行目で処理が終わるのですが、この直前にもクローズ処理を記入する必要があるのでしょうか? 1)<?php 2)$db = mysql_connect(host,user,pass); 3)mysql_select_db(db-name,$db); 4)$query = "INSERT INTO table(id,name) VALUES('1','なまえ')"; 5)if (!(mysql_query($query))) { 6) print = "書き込みに失敗しました。"; 7) exit(); 8)} 9)mysql_close($db); 10)?> 宜しくお願いします。

    • ベストアンサー
    • PHP
  • Access2003 インポートについて質問がございます。

    Access2003 インポートについて質問がございます。  すでに完成しているテーブルがあり、  そこに毎月のExcelデータを都度テーブルに蓄積していきたいのですが、  Accessを開かずしてテーブルにインポートすることは可能でしょうか。  すでにテーブルのフィールド順に、レコード単位でExcelに並べられている条件です。   (Excelの行コピー⇒ Accessテーブルの最終行に貼付でインポートできる状態) 初心者なもので大変恐縮ですが、ご教示をお願いいたします。  

  • MySQLでのテーブル名取得に制限はありますか?

    MySQL5.5.27, mysql-connector-java-5.1.12を用いて、DBにアクセスしています。 DBに登録されたテーブル名を取得しようと思い、以下の様なメソッドを作成しました(テーブル名は全て数字です)。 https://gist.github.com/4146754 しばらくは順調に動いていたのですが、DBに登録されたレコード数が25万を超えたあたりで、動かなくなってしまいました。 デバッグをして原因を調べたところ、 metadata.getTables(null, "%", "%", null); の実行時に、メソッドを呼び出したまま固まってしまっていることが分かりました。 同じコードを、別のDBに対して作用させたところ、問題なく動いたため、レコード数が多いのが原因ではないのかと考えたのですが、何かよい対処法はありますでしょうか? よろしくお願い致します。

    • ベストアンサー
    • MySQL