• 締切済み

データベースを分割することでパフォーマンスは向上する?

現在、Windows2003server+Apache2.0.59+PHP5.2.6の環境のサーバとMySQL4.0.26の環境のサーバがあります。 ibdataのファイルサイズが10GBを超えています。使用しているデータベースは1つだけです。 この度、パフォーマンスの向上のためデータベースを分割すればいいのではないかと検証中です。 データベース分割にあたってMySQL4.1.22の環境を用意して、my.iniにinnodb_file_per_tableの記述を追加しました。 そして、データは分類ごとにデータベースを分けてレコードを格納しました。my.iniのパラメタは4.0の時とほぼ同等に設定しました。 この状態で検証をすると、4.0(分割なし)の状態と変わらないか少し遅いぐらいです。 この手法は、パフォーマンス向上を目的とした場合間違っていますか? 間違っている場合は、他にどのような方法がありますか? SQL文でのチューニングは試行錯誤の結果のものを実行しています。

  • S202
  • お礼率84% (142/169)
  • MySQL
  • 回答数2
  • ありがとう数3

みんなの回答

回答No.2

データベースを分割しても、変わらないと思います。 ざっとMySQLのデータのあるフォルダを見ると、 1)テーブル定義やその他位置情報を保持していると見られる.frmファイル(各テーブルにつき1つ) 2)データが入っている巨大なファイル に分かれると思いますが、 処理を考えたとき、まず1)のファイルを見にいき、次に2)のファイルから部分的に切り出す(読み出す)、という処理があるはずです。 (メモリから読むにしても同等の処理がどこかで発生するはずです。) で、データベースを切り分けたときに、2)のファイルも切り分かれるかというと、そうではありません。データベース数と2)のファイル数は関係がありません。 以上のことから類推するに、データベースを切り分けても、結局参照しに行く実体ファイルの大きさは変わらないことから、速度は大して変化しないか、データベースの切り替えの分だけ遅くなる気がします。 (興味があるのが、4.0系と4.1系のパフォーマンスの差です。日本語を含むカラムがあると4.1系はパフォーマンスが低下するのでは・・?と個人的に思ってますが、どうなんでしょう?)

S202
質問者

お礼

アドバイスありがとうございます。 データベースを分割しても変わらないんですか。 一つ確認させていただきたいのですが、ご指摘の内容の(2)の巨大なファイルについてですが、これは「ibdataファイル」のことですよね。 設定ファイルmy.iniに【innodb_file_per_table】の記述をすると個々のテーブルごとにファイルが作成されます。テーブル毎なので、分割したデータベースそれぞれにファイルが作成されます。 この場合でも、ご指摘の内容の実体ファイルの大きさは変わらないのでしょうか? 4.0系と4.1系では、日本語を含むカラム名があるとパフォーマンスが低下するとのことですが、知りませんでした。 日本語を含むカラムが作成できるのも知りませんでした。

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

分割したデータを結合してSQLで抽出しているなら 結合する分処理が重くなるので前よりおそくなるでしょうね。 効率的なアクセスができるようなデータベースの設計がされていれば 速くなるはずです

S202
質問者

お礼

アドバイスありがとうございます。 分割したデータベースはデータベース内での結合は行っています。 yambejpさんが言われている、「分割したデータを結合して」というのは「innodb_file_per_table」でファイルを分割したテーブルの結合ということでしょうか? その場合は、この設定は外したほうが早くなるのでしょうか? 宜しくお願いします。

関連するQ&A

  • MySQLのバイナリデータについて

    Linux版MySQLで稼働していたデータベースをWindows版で稼働させたいと思っています。 データベースはinnodbです。 my.iniをWindowsの環境に合わせて書き換え、MySQLは起動したのですがテーブルが見れません。 mysqlデータベースは参照でき、ユーザー権限等も書き換えられるのですが、どうやらinnodbが見れないようです。 そもそもLinux版のinnodbはWindows版MySQLでは使用できないのでしょうか?

    • ベストアンサー
    • MySQL
  • InnoDBの利用

    InnoDBの利用 「show engines」を実行したら、InnoDBが出てきませんでした。 InnoDBを登録するには、どうすれば良いのでしょうか? my.iniは、my-innodb-heavy-4G.iniをコピーして使っています。 よろしくお願いします。 環境:mysql5.1.41-community+Windows2008

    • ベストアンサー
    • MySQL
  • データベースごとに文字コードを変えたい。デフォルトの文字コード

    MySQLサーバーで、すでに1つ別の目的のデータベースが 存在します。 デフォルトのデータベースは、my.iniでsjisに設定 されています。 このMySQLサーバーに別の文字コードでデータベースを 追加したいのですが、そのようにすればよいでしょうか?

    • ベストアンサー
    • MySQL
  • MySQLのストレージエンジンの種類について

    Windows環境でMySQL5.1.36のデータベースを使っています。 phpMyAdminで見るとストレージエンジンの種類が6つあります。 1) MEMORY 2) MyISAM 3) BLACKHOLE 4) MRG_MyISAM 5) CSV 6) ARCHIVE 私はInnoDBを良く使うのですがphpMyAdminではどのように設定するのでしょうか? InnoDBもMySQLのパラメータでバッファを増やすと、MEMORYエンジンと同じように 高速でINSERTのSQLが実行できます。 それを考えると、InnoDBだけ1個エンジンあれば良いと思ってしまうのですが、 なぜphpmyAdminでは6つのストレージエンジンがあるのでしょうか? それぞれの存在意義が知りたいです。

    • ベストアンサー
    • MySQL
  • MySQLの文字コードが変更されない

    お世話になっています。 EUCでPHPを書いています。 DBから取ったデータが文字化けしてしまいます。 全ての文字コードをujisにしたいのですが、変更できず困っています。 現在は以下のようになっています。 ――――――――――――――――――――――――――――――――――――― ■環境 Windows7(64bit) Mysql 5.5 ――――――――――――――――――――――――――――――――――――― ■my.iniのパス C:\ProgramData\MySQL\MySQL Server 5.5\my.ini ――――――――――――――――――――――――――――――――――――― ■サービスの起動パス "C:\Program Files\MySQL\MySQL Server 5.5\bin\mysqld" --defaults-file="C:\ProgramData\MySQL\MySQL Server 5.5\my.ini" MySQL55 (my.iniでポート変えたらCLIから接続できなくなったので、設定は反映していると思います。) ――――――――――――――――――――――――――――――――――――― ■my.ini [client] port=3306 default-character-set=ujis [mysql] default-character-set=ujis [mysqld] port=3306 character-set-server=ujis init-connect=SET NAMES ujis skip-character-set-client-handshake default-character-set=ujis default-storage-engine=INNODB sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" max_connections=100 query_cache_size=0 table_cache=256 tmp_table_size=10M thread_cache_size=8 myisam_max_sort_file_size=100G myisam_sort_buffer_size=69M key_buffer_size=55M read_buffer_size=64K read_rnd_buffer_size=256K sort_buffer_size=256K innodb_additional_mem_pool_size=3M innodb_flush_log_at_trx_commit=1 innodb_log_buffer_size=2M innodb_buffer_pool_size=107M innodb_log_file_size=54M innodb_thread_concurrency=10 [mysqldump] default-character-set=ujis skip-opt create-options set-charset hex-blob single-transaction ――――――――――――――――――――――――――――――――――――― ■コマンドラインからの確認 mysql> status; --------------------------------- Server characterset: utf8 Db characterset: utf8 Client characterset: ujis Conn. characterset: ujis ――――――――――――――――――――――――――――――――――――― 何かヒントを頂けないでしょうか。

  • Innodbデータ拡大方法を教えてください。

    こんにちは。。 教えてください。 現在Mysql 5.0.45を利用してInnodbを使っています。 初めて、MysqlのInnodbを運用しておりますが データ容量が設計以上膨らんで 下記のようになってしまいました。 ------------------------------ #ls -al ibdata1 -rw-rw---- 1 mysql mysql 31182553088 5月 1 19:51 ibdata1 # du -sh ibdata1 30G ibdata1 ------------------------------ 問題は現在、サーバー上のハードディスク容量が少ないことで、 半年以内にハードディスクがFullになってしまう恐れがあります。 それでibdata1(innodb)から分離して、新しいストレージにibdata2(innodb)拡張を検証しました。 my.cnf innodb設定部分を(defalut) innodb_data_file_path = ibdata1:10M:autoextend ↓↓ innodb_data_file_path = ibdata1:32G;/ストレージサーバ/ibdata2:50G;/ストレージサーバ/ibdata3:10M:autoextend 上記のように検証しましたが、運用上では、無理でした。 いろいろ、やって見ましたが、失敗の連続。。。 Mysqlサイトではデータをバックアップ後に再構築方法しかないと書いておりますが、 http://dev.mysql.com/doc/refman/5.1/ja/adding-and-removing.html しかしながら、現在Innodbデータが30GぐらいでバックアップとImportするには相当時間が掛かってしまい、事実上で無理ですが、、 こんな時にはどうすれば宜しいですか。。 皆さん、教えて下さい。一週間ぐらい悩んでいます。。宜しいお願いします。

  • パフォーマンスの最適化はどちらをチェックすべきか?

    現在2000サーバで主なものをあげると、(1)販売管理系のアプリと、(2)SQLサーバと、(3)プリントサーバ(フォームオーバーレイ込み)の運用を行っております。 この環境でユーザーから”レスポンスが悪い”意見がかなり出ております。 チューニングするにあたって、「システムのプロパティ」→「詳細」→「パフォーマンスオプション」→「パフォーマンスの最適化」にて現在「バックグラウンドサービス」をチェックしておりますが、「アプリケーション」をチェックすべきなのでしょうか? ちなみに、SQLサーバのプロパティでメモリの上限設定を実メモリの半分(1024MB)を設定して運用しています。

  • DBの縮小について

    CentOS4.2Q&MySQL4.1.20環境にてInnoDBタイプでDBを作成しました。 テストデータを大量に突っ込んだところ、/var/lib/mysql/ibdata1という巨大(約6GB)なファイルができた為、あわててデータをdeleteしましたが、該当ファイルについて容量が縮小しません。 これは諦めるしかないのでしょうか。同様の経験のある方がいらっしゃいましたらアドバイスをお願い致します。

    • ベストアンサー
    • MySQL
  • データベース名などこれで合っているでしょうか・・。

    すいません。初めてデータベースを扱うのですが、今までローカル環境でしか動かしていないため どのように実際に動かすのか分からない部分があります。(サイトは完成していましてローカル環境ではちゃんと動きました) まずデータベース名やアカウント名なのですが、データベースのためにさくらのサーバーを借りました。 データベースの設定画面を見ると以下のようになっています。 ----------------------------------------------------- データベース バージョン: MySQL 5.5 データベース サーバ mysql9999.db.sakura.ne.jp データベース ユーザ名 (初期アカウント名) abcd777 接続パスワード変更 ************ データベース名 abcd777_data ------------------------------------------------------- 上記の場合以下で合っているのでしょうか? $pdo = new PDO("mysql:dbname= _abcd777_data ; host=mysql9999.db.sakura.ne.jp", "abcd777", "************"); ポート番号なども設定があるような事も書いてあるサイトがあるのですが何をどうしてよいのか 全く分かりません。(とりあえず上記のような設定でデータベースからデータをphpで呼び出しましたが 上手く動きませんでした) もう一つ疑問があるのですが、私はトップページをindex.phpとしましたが、上記のような方法では アカウントやらパスワードが丸見えですよね? そもそも私は全く違う事をしているのでしょうか? できれば実際の運用の流れも簡単に書いてもらえると助かります。

  • データベースは何が良いでしょうか?

    現在、データベースを使用するシステムを構築しようとしています。 現在、想定している環境は、以下の通りです。 1.Windows2000上で動作する。 2.データベースの読み書き用のプログラムは、VB.NETを使用して開発する。 3.テーブルのレコード数は最大1000×365=約37万件 (1000件の顧客で、356日分のデータ) 4.1顧客につき、1月単位、1日単位でデータの表示及び印刷を行う。 現在、データベースの候補として、 ACCESS SQLサーバー オラクル MySQL等を想定しています。 私としては、パフォーマンス的に問題ないならACCESSにしたい。問題があるならSQLサーバーにしたいと考えております。理由は、VB.NETに合うのは同じマイクロソフトの製品だろうという漠然としたものです。また、ACCESSが一番簡単でてっとり早いような気がしたからです。 上記の中で、お薦めのデータベースがありましたらコメントください。またその理由もお願いします。(上記以外でもかまいません)