• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:MySQL インメモリでINSERTの方法について)

MySQL インメモリでINSERTの方法について

yambejpの回答

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

>1.2GBのデータを2GBメモリのマシンで展開している そういう単純計算ではないと思いますが・・・ インサート時のCPUやメモリの負荷をみれば、改善個所も変わってくるでしょう 私見ですが2GBメモリだと1億のデータを扱うには圧倒的にたりないと思います あとはテーブルの構成をよほどうまく調整するしかないですね インサートのスピードについては公式マニュアルを参考に http://dev.mysql.com/doc/refman/5.1/ja/insert-speed.html

tajix14
質問者

補足

早速のご投稿ありがとう御座います。 >そういう単純計算ではないと思いますが・・・ そうですよね。私もそうだとも思ったのですが.. >私見ですが2GBメモリだと1億のデータを扱うには圧倒的にたりないと思います あくまでテスト環境です。本番環境ではxeon5570(quad core 2.93 HT)X2連装(16スレッド)、メモリ16GBで対応予定です。 Quadcore2.4GHz 2GBメモリはあくまでテスト環境ですが、このテスト環境に1000万行の書き込みをしたところ、CPU使用率は40%ほどしかなく、メモリも余裕があるのに、IOだけが完全に溢れております。 種々のテスト結果、現状ではinsertは数千行/秒のイメージのため、raid10で対応しようとは思っていますが、それでも倍速にしかなりません。 そこで、ディーエヌエーの松信氏が言う秒間15000 insert/s超えを達成させる「インメモリでINSERTを完結」させる方法という言葉に期待して質問したところです。 ご記入頂きましたURLを拝見しましたが、残念ながらインメモリでINSERTの方法について触れられておりませんでした。 さらなる情報が御座いましたらご教授願いただきたくお願い申し上げます。 情報頂きましたこと御礼申し上げます。

関連するQ&A

  • MySQL 肥大化したテーブルへのINSERT速度

    タイトルの件について、分かる方おりましたらどなたかご教授ください。 [DBサーバ] Linux CentOS 6.4 CPU Xeon core4 SSD 250GB RAM 32GB バージョン情報 MySQL 5.5 tomcat 6 JDK 6 会員データをCSVから大量にUSERテーブルへINSERTする処理を行っています。 また、それに関連するデータも同時にINSERTをします。 (USER_ID を持っている SERVICE_POINTテーブルやADDRESSテーブル) 処理の流れとしては以下となります。 (1) 会員情報の入ったCSVファイルをサーバへアップロード (2) 1でアップロードしたCSVファイルを○○○○件毎に一時ファイルに切り分ける ~~ ここからバックグラウンドで実行 ~~ (3) 2で切り分けたファイルをループで回しながら、メアドの重複やフォーマットエラーなどを判定する (4) 3でエラーがあれば即座にERRORSテーブルにエラー詳細をINSERTし、コミット&continue; (5) 3でエラーがなければUSERテーブル・SERVICE_POINTテーブル・ADDRESSテーブルへINSERT処理 (6) その他関連するテーブルへUPDATE処理 (7) 3に戻る ストレージエンジンは全てInnoDBです。 my.cnfのInnoDBの設定は以下の通りです。 innodb-buffer-pool-size = 24G innodb-log-buffer-size = 8M innodb-log-file-size = 1024M innodb_log_files_in_group = 3 innodb_fast_shutdown = 0 innodb_data_file_path = ibdata1:10M:autoextend innodb_file_io_threads = 4 innodb_change_buffering = all innodb_thread_concurrency = 16 innodb_flush_log_at_trx_commit = 2 innodb_max_dirty_pages_pct = 90 innodb_flush_method = O_DIRECT innodb_lock_wait_timeout = 120 innodb_additional_mem_pool_size = 128M innodb_file_format = Barracuda innodb_file_per_table = 1 なお、ERRORSテーブルのINSERTは非常に速いです。 会員数が全くない状態だとスムーズに登録されていくのですが (1秒に15件程度) テーブルが肥大化して20万件を超えると1秒に1件ほどしかINSERTされません。 この速度を少しでも速くしたいなと思っています。 1件ずつコミットしているのには理由があります。 ただ、1000件ずつコミットしても速度はほぼ変わりませんでした。 こういう場合、やはりパーティショニングを検討しなければならないでしょうか。 よろしければどなたかご教授ください。 以上、よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • AUTO_INCREMENT の値をINSERT前に知りたい

    PHP(PEAR)+MYSQLでWEBアプリを作成しているのですが、AUTO_INCREMENTを設定した値をデータのINSERTを行う前に取得したいのですが、どのようにすればいいのでしょうか?INSERT後であればLAST_INSERT_ID()やmysql_insert_id()で取得できるのは分かっているのですが…。ちなみに現在のテーブル型はInnoDBです。MySQLもしくはPearの命令でお分かりになる方お教えください。よろしくお願いします。

  • PHP/MySQL INSERT文について。

    PHP/MySQL INSERT文について。 こんばんは。 PHP・MySQLでデータベースへデータの書き込みを試行錯誤しております。 そこで一つどうしても解決出来ない問題(謎)があるので質問させて頂きます。 簡易的な質問内容としては 全てのカラムに対する値の挿入は可能なのに カラムを指定して値を挿入しようとしたらエラーが出ます。 データベースの設定はテーブル名【TESTtable】 フィールド 種別 NULL 属性/その他 AAA int(6) No UNSIGNED ZEROFILL / auto_increment BBB int(4) Yes CCC int(4) Yes DDD int(4) Yes PHPでのSQL実行文をしてはの記述としては(値は全て可変で数値を代入します。) INSERT INTO TESTtable VALUES (last_insert_id(),50,600,50) とした場合は問題無くテーブルに書き込みされますが カラムを指定して INSERT INTO TESTtable (AAA,BBB,CCC,DDD) VALUES (last_insert_id(),50,600,50) とした場合、書き込みが行われません。 INSERT INTO TESTtable ('AAA','BBB','CCC','DDD') VALUES (last_insert_id(),50,600,50) INSERT INTO TESTtable (AAA,'BBB','CCC','DDD') VALUES (last_insert_id(),50,600,50) INSERT INTO TESTtable ('AAA','BBB','CCC','DDD') VALUES (last_insert_id(),'50','600','50') 等、色々試してみましたが不可能でした。 カラムAAAはauto_incrementにりますので毎回書き込みされますが BBB、CCC、DDDは書き込みが不要の場合もあるので カラム指定の書き込みは必須となるのですが・・・行き詰ってしまいました・・・。 ご教授頂ければ幸いです。 どうぞ、宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • バルクINSERT直後に、最後のIncremet値は取得できますか?

    PHPからMySQLへトランザクションを使わずに、 INSERT INTO test (id,count) VALUES (5,5),(6,6) のようにINSERTした直後に、SELECT LAST_INSERT_ID(); としても、5が返却されてしまいます。 これはMySQLの仕様でしょうか? 又、 SELECT LAST_INSERT_ID() ではなく、 SELECT LAST_INSERT_ID() FROM test; のようにテーブル名を指定する方法は何か意味があるのでしょうか? テーブル名を指定すると、テーブルにあるレコード数分 データが返却されてしまいました。。

    • ベストアンサー
    • MySQL
  • insert した結果を insert する

    SQLServerを使用してinsertした結果をinsertしたいのですが、そのクエリをどう書けばいいのか分からず困っています。(ちなみに1000行データを作成したいです) 具体的には下記のような内容です。 (1)注文テーブル[Id, 注文内容,注文個数,顧客Id←(2)のIdのことです)] (2)顧客テーブル[Id, 名前,住所] テストデータを作成するために、(2)のデータをinsert文で登録し、その登録したデータのIdをさらに(1)のテーブルの顧客Idに挿入したいです。 上記にも記載しましたが、このデータを1000行作成する方法も知りたいです。 説明が分かりにくいうえに、不足している箇所があるかもしれないのですが、 どなたか分かる方がいればぜひ教えていただきたいです。 よろしくお願いします。

  • MYSQLのINSERT記述をもっと分かりやすくしたい

    MYSQLで、DB更新の時の記述の基本はこんな感じですよね。         UPDATE             テーブル名         SET             `フィールド名`  =   "データ名",             `フィールド名`  =   "データ名",             `フィールド名`  =   "データ名",             `フィールド名`  =   "データ名" 「フィールド」と、「値」が横に並んでて実に見やすい、分かりやすい。 ところが新規挿入の時は         INSERT         INTO             テーブル名         (             `フィールド名`,             `フィールド名`,             `フィールド名`         ) values (             `データ`,             `データ`,             `データ`         ) と、「フィールド」と「値」が縦にならんでて、 どれがどれに対応しているのか実に分かりにくい。 フィールドが20個も30個もなると だんだん分けがわからなくなってくる。 そこで、みなさんは、インサートする時の記述はどのように工夫して 分かりやすくしているでしょうか。 今まで、行番号の下一桁を揃えたり、/*10行目*/ /*20行目*/ 等のコメント文を入れたりしていましたが、 根本的解決にならず分かりにくいままでした。

    • ベストアンサー
    • MySQL
  • updateではinsertできない?

    フィールド名だけ決まったテーブルがあります。中は空っぽです。これに対してインサートすればデータが追加さえるのはわかります。 しかしアップデートをかけると、インサートと同じ結果を返すことができるでしょうか? 例えばテーブルABCがあります。列1はA、列2はBとあります。update ABC set A='1',B='2'とやればテーブルABCにデータが インサートされることになるでしょうか?手元にデータベースがあればよいのですが、ありませんので、このような質問お許しください。

  • MySQLのInnoDBテーブルについて

    MySQLのバージョンは4.1.13-ntです。 元々MyISAMテーブルを使用してたんですが、トランザクション機能を使いたいということでInnoDBテーブルに変えたところ、検索に凄く時間がかかるようになりました。データ件数は二百万件ぐらいです。MyISAMテーブル の時は数秒でかえってきたのが、InnoDBテーブルでは何分という結果になりました。 InnoDBは早いと聞いたのですが、データが大量になると遅くなるのでしょうか?ご教授お願い致します。

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

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

    • ベストアンサー
    • MySQL
  • 正規化したテーブルのinsertの方法

    データベースを勉強しているものです. 勉強の題材としてWEBアプリで予約システムみたいなものを作ってみているのですが,正規化したテーブルに対してデータを追加する際にどのようにすればいいのか悩んでいます. 予約tableと予約詳細tableを作り,予約IDで関係付けようと思っているのですが, 予約が入った際に予約tableのデータをinsertしてから予約詳細tableにinsertをすると思われます.このとき,予約詳細tableにデータをinsertする際に予約IDをどのように入れたらいいでしょうか. 1.トランザクション開始 2.予約IDを払い出し(WebAP上の変数で保持する) 3.予約tableに予約IDと登録するデータをinsert 4.予約詳細tableに予約IDと登録するデータをinsert 5.コミット これをやってしまうと予約IDが別のセッションで同じIDになってしまう恐れがあります. どうしたらいいでしょうか. 予約IDテーブルでも作って,払い出した際に,他のセッションに奪われないように作るなどの方法をとればいいのでしょうか.