1. ホーム
  2. データベース
  3. マイサク

MySQLデータベースで数百万件のデータを10秒間で挿入

2022-01-07 04:22:52

まず、問題を考えてみよう。

これだけ膨大なデータをデータベースに挿入するには、頻繁にアクセスするのが普通の状況に違いないが、どんなマシンやデバイスもそんな余裕はない。では、どうすればデータベースへの頻繁なアクセスを避けることができ、一度だけ実行することができるでしょうか?

実はJavaがその答えを出してくれているんです。

ここでは、2つの重要なオブジェクトが登場する。 [root@hailiang tmp]# modinfo helloworld.ko filename: helloworld.ko alias: a simplest module description: A simple helloworld module author: zhanghailiang depends: vermagic: 2.6.27.5-117.fc10.i686 SMP mod_unload modversions 686 4KSTACKS ステートメント #include <linux/utsrelease.h> #include <linux/module.h> /* Simply sanity version stamp for modules. */ #ifdef CONFIG_SMP #define MODULE_VERMAGIC_SMP "SMP " #else #define MODULE_VERMAGIC_SMP "" #endif 。。。。。。。。。。。。。。。。。。。 #ifdef CONFIG_MODVERSIONS #define MODULE_VERMAGIC_MO DVERSIONS "modversions " #else #define MODULE_VERMAGIC_MODVERSIONS "" #endif #ifndef MODULE_ARCH_VERMAGIC #define MODULE_ARCH_VERMAGIC "" #endif #define VERMAGIC_STRING / UTS_RELEASE " " / MODULE_VERMAGIC_SMP MODULE_VERMAGIC_PREEMPT / MODULE_VERMAGIC_MODULE_UNLOAD MODULE_VERMAGIC_MODVERSIONS / MODULE_ARCH_VERMAGIC

両者の特徴を見てみましょう。

使用するBaseDaoツールクラス(jarパッケージ/Maven依存)(Maven依存コードは文末に添付)(使いやすいようにラップしてあります。)

注:(強調)rewriteBatchedStatements=trueで、複数のデータを一度に挿入、一度だけ!。

[root@hailiang 2.6.27.5-117.fc10.i686]# make menuconfig
scripts/kconfig/mconf arch/x86/Kconfig
# make menuconfig
# configuration written to .config
# configuration written to .config

*** End of Linux kernel configuration.
*** Execute 'make' to build the kernel or try 'make help'.

[root@hailiang 2.6.27.5-117.fc10.i686]# make 
scripts/kconfig/conf -s arch/x86/Kconfig
  CHK include/linux/version.h
  CHK include/linux/utsrelease.h
make[1]: *** No rule to make target `missing-syscalls'.  Stop.
make: *** [prepare0] Error 2

次に、キーコードとコメントです。

/* Because the database is incredibly fast, the single throughput is very high and the execution is very efficient.
    addBatch() loads a number of sql statements together and sends them to the database for execution one at a time, which takes a very short time to execute
    while preparedStatement.executeUpdate() is sent to the database one by one for execution time is consumed in the database connection transfer *public static void main(String[] args) {
    long start = System.currentTimeMillis(); // Get the current time of the system, before the method begins to execute the record
    Connection conn = BaseDao.getConn(); // call the static tool class just written to get the connection to the database object
    String sql = "insert into mymilliontest values(null,? ,? ,? ,NOW())"; // the sql statement to be executed
    PreparedStatement ps = null;
    try {
        ps = conn.prepareStatement(sql); // get PreparedStatement object
        // keep generating sql
        for (int i = 0; i < 1000000; i++) {
            ps.setString(1, Math.ceil(Math.random() * 1000000) + "");
            ps.setString(2, Math.ceil(Math.random() * 1000000) + "");
            ps.setString(3, UUID.randomUUID().toString()); // UUID This class is used to generate a random string that will not be repeated
            ps.addBatch(); // Add a set of parameters to the batch command of this PreparedStatement object.
        }
        int[] ints = ps.executeBatch(); // submits a batch of commands to the database for execution and returns an array of update counts if all commands are executed successfully.
        // If the length of the array is not 0, then the sql statement is executed successfully, i.e. millions of data are added successfully!
        if (ints.length > 0) {
            System.out.println("One million pieces of data have been successfully added! ");
        "); }
    } catch (SQLException throwables) {
        throwables.printStackTrace();
    } finally {
        BaseDao.closeAll(conn, ps); // call the static tool class just written to release resources
    }
    long end = System.currentTimeMillis(); // get the system time again
    System.out.println("duration:" + (end - start) / 1000 + "seconds"); // subtract the two times to be the duration of the method execution
}

最後に、効果を確認するために実行します。

ねえ、ここで10秒以上の長さは、デバイスはほとんど意味が、ハ〜を理解するために願っています。

<! -- mysql-connector-java dependencies used to connect to the database -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.27</version>
</dependency>

PS : スレッドを追加することでより高速になりますが、それは次の記事で例示します。

この記事は、MySQLデータベースが数百万件のデータを10秒で挿入することについてのすべてです。MySQLが数百万件のデータを挿入することについての詳細は、BinaryDevelopの過去の記事を検索するか、以下の関連記事を引き続き参照してください。