• 締切済み

MySQLに100万件登録する最も効率の良い方法

A(600)xB(800)xC(3)で144万件の作成してMySQLへ登録したい のですが、最も効率良く登録する方法は何でしょうか? 私がとりあえず思いつくのは、下記2つのうち案2)です。 案1)プログラム&MySQL 1.PHPなどのプログラムのループ処理でテストデータを作成 2.mysql>LOAD DATA INFILE "/path/to/file.csv" INTO TABLE tablename FIELDS TERMINATED BY ","; 懸念点:メモリが足りず小分けにしないとインポートできなそう。 案2)プログラムのみ 1.PHPなどのプログラムのループ処理でテストデータを作成し、   1つのINSERT文で、1000件ぶんを一気にコミット 例:INSERT INTO table (a,b,c) VALUES (1,1,1),(1,1,2)・・・

  • php4
  • お礼率42% (373/888)
  • MySQL
  • 回答数1
  • ありがとう数2

みんなの回答

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

いまいち状況がつかめないのですが、とりあえず普通にやるなら 案2でしょうね。 ただ、144万件をわざわざ登録しないといけないのでしょうか? A、B、C別データで管理すればよさそうな気が・・・ とはいえ、とりあえずこんなこともできないことはないので、参考程度に。 (大量のデータで検証はしてませんのでチャンと動くかはわかりません) CREATE TABLE `A`(`data` int); INSERT INTO `A` VALUES(1),(2),(3); CREATE TABLE `B`(`data` int); INSERT INTO `B` VALUES(1),(2),(3); CREATE TABLE `C`(`data` int); INSERT INTO `C` VALUES(1),(2),(3); CREATE TABLE `D` SELECT CONCAT(A.`data`,"-",B.`data`,"-",C.`data`) AS `data` FROM A,B,C

php4
質問者

お礼

すみません。質問を間違えました。 A,B,Cは別列です。しかしながら、勉強になりました。 ありがとうございます。

関連するQ&A

  • MySQLでGETで2件同じものが登録されてしまいます

    PHP、MySQLとも初心者で、お世話になっています。 <form name="~" method="GET" action="~.php"> 入力1<input type="text" name="na1"><br> 入力2<input type="text" name="na2"><br> <input type="submit" value="送信"> </form> で送信し、PHP側で $tem1=$_GET["na1"]; $tem2=$_GET["na2"]; mysql_select_db("~"); mysql_query("insert into tb1 values (\"$tem1\",\"$tem2\")"); とすると、結果的に同じデータが2件登録されてしまいます。 何が問題なのでしょうか。 教えていただけるとありがたいのですが。 どうか、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • mySQL

    今日は mySQLにて あるテーブルへデータを入れようと、 INSERT INTO table VALUES( "000", "?", "試験" ) といった具合に、入れてみました。 アクセスでリンクしてあるので、フィールドを見ると 半角「?」はNULLに置き換えられてますが なぜ?

  • MySQLが不可

    CSVから読み込んだデータを複数のテーブルにInsertする処理なのですが、300件くらいまでは正常にインサートできるのですが、それ以降になると急に遅くなり、インサート処理ができません。 my.cnfの各パラメータは調整しております。 環境はApache2+PHP5+MySQL5です。

  • MySQLから取り出したものを3つに分ける

    MySQLに以下のようなSQLを打ちました。 create table table_list( id int, task varchar(255) ); insert into table_list values(1,'ほげほげ1-1'); insert into table_list values(1,'ほげほげ1-2'); insert into table_list values(2,'ほげほげ2-1); insert into table_list values(2,'ほげほげ2-2'); insert into table_list values(3,'ほげほげ3-1'); そして、空のdiv要素が3つあります。 このデータベースからidの数値別に、div要素へtaskの文字列を入れたいのですが、どうすればいいのでしょうか? SQLで「select * from table_list」をやってからtaskを取り出すのか、3回SQLで「select task from table_list where id=1」のようにするのがよろしいんでしょうか?

    • ベストアンサー
    • PHP
  • mysqlで簡単に10000万件データを作る方法

    度々載せます。 下記で載せていた件は、何とか解決しました。 一つ教えていただきたいのですが、 INSERT文で10000件ぐらいのデータを簡単に作成する方法は ありませんか?? CSVファイル??みたなのを作って、 LOAD DATAコマンドでできそうな気がしますが、 サンプルとかありませんか?? 私は、windowsの環境でmysqlを使っております。 Linuxではないので、ちょっと困ってます。 お願いします。

    • ベストアンサー
    • MySQL
  • mysqlへcsvファイルの読み込み

    mysqlについて質問させて下さい。 エクセルをcsvファイルに変換したものを、データベースに読む込んだのですが、下記のエラーが出ます。 for column 'id' at row 1ect integer value: 'id,number 整数が間違っていると言うことかと思い、エクセルのほうはデータを全部数値にし、mysqlのほうは「int」にしました。 これでも同じエラーが出てしますのですが、原因がお解かりの方、教えて頂けると助かります。 sql文です。 LOAD DATA INFILE "***.csv" INTO TABLE dbname.tablename; カラムはidとnumberのみです。 よろしくお願いします。

  • Flash→PHP→MySQLへの値の受け渡しについて

    現在、Flashのフォームで受け取った値をPHP経由でMySQLへデータを格納するシステムを作成しています。 現在、詰まっている点とは、Flashで送信したデータがMySQLまで到達できないというところです。 少し分析してみたところ、PHPを単独でブラウザにて開くと "フィールドが取得できません。" と出力されていました。 これは、 ----- <?php $setsuzoku = mysql_connect("localhost", "*****", "*****"); if (! $setsuzoku) { die ("データベースに接続できません"); } if (! mysql_select_db ("test")) { die ("データベースが取得できません"); } mysql_query("INSERT INTO rank VALUES('".$HTTP_GET_VARS['nickname']."', ".$HTTP_GET_VARS['score']); if (!$fd) { die ("フィールドが取得できません。"); } // 処理が終わったことを知らせる print('OK'); ----- というプログラムで動かしていまして、『mysql_select_db ("test")』まで動作しているのではないかと思われます。 ですので、もしかしたらFlash以前にPHPとSQLの連携がうまくいっていないような気がするのですが…どうでしょうか? Flashからの情報を送信するシステムである以上、PHPで表示すると必ずこのような形になるのでしょうか? ちなみにMySQLには、必要なDatabaseとテーブルを作成しました。 問題の切り分けは一応してみましたが、間違っているかもしれません。何かご教授頂ければ幸いです。 よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • MYSQLについて教えてください!

    お世話になります。 VB.net+MYSQLで開発してます。 MYSQLで聞きたいことがあるのですが、 今やろうとしている処理が 配列の要素数分ループ処理でインサートしようとしています。 しかし書き方が悪いのか配列名(カウンタ)という記述だと Functionに見られてしまいます。 それならと配列の要素を変数に代入して INSERTには変数をあてているのですが 変数が展開されません。。。 PHPとかだと変数の前に「.$」をつけると出来ると書いてあったのですが VBにも特殊なルールがあるのでしょうか? 以上よろしくお願いします。 以下サンプルソースです。(接続等はぶいてますが接続はできてます) Dim a As String Dim sqlstr As String Dim sqlcommand As Odbc.OdbcCommand for i as Integer = 0 to uBound(data_array) '初期化 a = "" '変数に値を設定 a = data_array(i) 'SQL文字列の設定 sqlstr = "insert into test( col_1 )" + _ "values(a);" sqlcommand.CommandText = sqlstr sqlcommand.ExecuteNonQuery() next

  • MYSQLのレコードを上書きしたいのですが…

    phpからMYSQL5に接続して以下のようなデータベースを作りました。 no name comment ←カラム名 1  山田 起きる 2  山田 叫ぶ 3  山田 寝る これを上書きして、 no name comment 1  山田 食べる 2  山田 遊ぶ 3  山田 寝る というようにレコードを更新したいのです。 しかし、どうやっても1、2、3の後に4、5、6と続いてしまいます。 「no」カラムにはauto_increment+primary keyを設定しています。 phpで構文を送る前に mysql_query("alter table db1 auto_increment=0"); を設定してみたり、 mysql_query("insert into db1 (name,comment) value ('山田','$comment')"); や mysql_query("replace into db1 (name,comment) value ('山田','$comment')"); を試してみましたが、上手く行きませんでした。 現在は、 mysql_query("delete from db1"); mysql_query("alter table db1 auto_increment=0"); ---php処理--- mysql_query("insert into db1 (name,comment) value ('山田','$comment')"); というように、二度目の書き込みを行う前に一旦テーブル内のレコードを すべて削除して書きなおすという方法を取っています。 しかし、数が多くなると一旦削除する作業を行うと処理が遅くなってしまうと思いますので、上書きしてデータベースを更新したいと思っているのですが、どのようにすればよいでしょうか?

    • ベストアンサー
    • MySQL
  • PHP+MySQLでのINSERTの処理遅延

    PHP + MySQLのINSERTについて、不可解な現象が出ましたので、知っている方がいたら教えてください。 PHPでMySQLのデータ読み書きのプログラム(コマンドラインではなく、ブラウザで表示する)を書いたところ、PHPのプログラムの流れよりも、MySQLの書き込みが済んでしまっているような現象が発生しました。 プログラムソースの抜粋を以下に記述します。 ################# PHPのプログラム抜粋開始 ########## ~ DB接続処理 ~ //================================================== // STEP1:既に存在するデータを表示 //-------------------------------------------------- $sqltable = 'test'; $sqlcommand = "SELECT datadayo FROM $sqltable"; $sqlresult = mysql_query($sqlcommand, $sqllink) or die('ERROR'); while($tmpsqlread = mysql_fetch_array($sqlresult)) { echo "$tmpsqlread[datadayo]<br>"; } //================================================== // STEP2:データ追加 //-------------------------------------------------- $sqlcommand = "INSERT INTO $sqltable (autoid,datadayo) VALUES (NULL,'書き込んだデータ')"; $sqlresult = mysql_query($sqlcommand, $sqllink) or die('クエリの送信に失敗しました。'); ~ DBクローズ処理 ~ ################# PHPのプログラム抜粋終り ########## フローとしては、最初にSTEP1が処理されてSTEP2が処理されるはずです。 ■プログラム開始の時の条件 データベースをCREATEした直後にこのプログラムを流す。(つまり空の状態) ■予想した結果 1.STEP1において、まだデータベースは空の状態なので、echo文では何も表示されない。 2.STEP2において書き込まれる。 3.再度このプログラムを流す 4.STEP1において、上記2で書き込んだデータが表示される。 ■実際の結果 STEP1において、まだデータベースは空の状態のはずなのに、echo文で「書き込んだデータ」が表示される。 今まで、何度もこの手のプログラムを作成しましたが、このような現象は初体験です。 書き込みタイミングの遅延による現象ではなく、むしろ書き込みが早すぎる事による(PHPの処理が来る前にMySQLが処理されている)現象です。 PHPのバージョンは PHP 5.2.11 with Suhosin-Patch 0.9.7 (cli) MySQLのバージョンは Ver 14.14 Distrib 5.1.39 です。 どなたか、ご存知の方、ご教授いただけたら幸いです。

    • ベストアンサー
    • MySQL