sql >> データベース >  >> RDS >> Mysql

SQLServerからMySQLへのデータ転送

    以前は、Javaでjdbc-odbcブリッジを使用してこれを実行していましたが、ODBCを介したパフォーマンスはあまり良くありません。 http://jtds.sourceforge.net/ のようなものを見ることをお勧めします これは純粋なJavaドライバーであり、次のような単純なGroovyスクリプトにドロップできます。

    import groovy.sql.Sql
    sql = Sql.newInstance( 'jdbc:jtds:sqlserver://serverName/dbName-CLASS;domain=domainName',     
    'username', 'password', 'net.sourceforge.jtds.jdbc.Driver' )
    sql.eachRow( 'select * from tableName' ) { 
      println "$it.id -- ${it.firstName} --" 
      // probably write to mysql connection here or write to file, compress, transfer, load
    }
    

    次のパフォーマンス数値は、パフォーマンスの感触を示しています。 http://jtds.sourceforge.net /benchTest.html

    データをmysqlダンプファイル形式にダンプし、行ごとに書き込む代わりにmysqlloaddataを使用することでパフォーマンス上の利点が得られる場合があります。 MySQLでは、infileをロードしたり、アトミックテーブルスワップなどを実行したりすると、大規模なデータセットのパフォーマンスが大幅に向上します。

    このようなものを使用して、あるシステムから別のシステムに大きなデータファイルをmysqlにすばやくロードします。これは、データをmysqlにロードするための最速のメカニズムです。しかし、リアルタイムの行ごとは、groovy +いくつかのテーブルで実行して、どの行が移動されたかを追跡するための単純なループである可能性があります。

    mysql> select * from table into outfile 'tablename.dat';  
    
    shell> myisamchk --keys-used=0 -rq '/data/mysql/schema_name/tablename'
    
    mysql> load data infile 'tablename.dat' into table tablename;
    
    shell> myisamchk -rq /data/mysql/schema_name/tablename
    
    mysql> flush tables;
    mysql> exit;
    
    shell> rm tablename.dat
    


    1. インラインvarchar(max)列を使用する必要がありますか、それとも別のテーブルに保存する必要がありますか?

    2. 10kレコードのLIKE演算子を使用してmysqlクエリを最適化する

    3. OdbcConnectionは漢字を?として返します

    4. 'Order by'が指定されていない場合、クエリはレコードセットに対してどの順序を選択しますか?