python + MySQLは:データベースに千万データを実現しました

運用要件

ジョブの要件は、教科書であるmovies(title,year,length,movietype,studioname,producerC)10万件のレコードを追加します。

movies主キー(title,year)

分析

情報を確認すること

  • INSERTステートメントの複数が、1つにまとめることができ、すなわち、INSERTステートメントは、タプルの複数を挿入します
  • トランザクションによって、事務の消費によって引き起こされる新時空を作成するために、各insert文を削減
  • することによりload data infile、データファイルは、MySQLをインポートするために、それはすぐにように思えます

それはすぐに第三のようだが、ここで私は最初の2つの方法、+をマージすることにより達成トランザクションを使用しましたが。

等のアナログIパイソン(主キーで唯一の年間の変化、異なるタプルを生成するために)100万回の記録によって生成され、それが組織され、\(10 \ times100 \ times10000 \ ) レコードが追加moviesそれぞれ、10回のトランザクションに分け、総務、100の挿入文があり、各insert文は万元のグループを挿入します。

実現

次のようなアイデアの実現は、以下のとおりです。

  1. 元のデータベースをコピーmoviedbしますnewmoviedb
  2. 十分な数のinsert文タプルに挿入できることを保証するために、max_allowed_pa​​cketの設定
  3. 第1のインサートのpython insert文万元グループを生成します
  4. トランザクションに含ま100のINSERT文を生成するのpythonを使用して、SQLにファイルを保存
  5. SQLファイルのNavicatを実行します

この時点では、挿入された百万記録を達成することができます(私のコンピュータが327sを取る?!?非常に遅いようです)

その後、設定した後、一つの完全なサイクルが100万件のレコードを挿入続けることができます。

下記のステップで使用してもよい(記載していない場合は、コマンドラインまたはMySQLの環境におけるデフォルトの制御コード):

コピーデータベース

新しいデータベースを作成しますnewmoviedb

データベースを作成するには、ログインしてください:

mysql -u root -p

CREATE DATABASE `newmoviedb` DEFAULT CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI;

newmoviedbにコピーmoviedb

コピーデータベース

mysqldump moviedb -u root -pchouxianyu --add-drop-table | mysql newmoviedb -u root -pchouxianyu

以上がchouxianyu私のMySQLのパスワードです

newmoviedbを入力します。

use newmoviedb;

設定のmax_allowed_pa​​cket

max_allowed_pa​​cketのは100Mに設定されています

set global max_allowed_packet = 100*1024*1024;

映画に(デバッグ用)すべての要素を削除します。

delete from movies;

insert文を生成

以下はありますinsert.py

insertStr = "INSERT INTO movies(title,year,length,movietype,studioname,producerC) VALUES"
value1_str = "('mymovietitle',"
# j
value2_str = ",120,'sciFic','MGM',100)"
# ,;
num_value = 10000

f = open(r'C:\Users\Cxy\Documents\Navicat\MySQL\Servers\MySQL\newmoviedb\insertRow.sql', 'w')  # 清空文件内容再写

f.write(insertStr)
for j in range(1, num_value):
    f.write(value1_str)
    f.write(str(j))
    f.write(value2_str)
    f.write(',')

f.write(value1_str)
f.write(str(num_value))
f.write(value2_str)
f.write(';')

f.close()

トランザクションの生成

以下は、transaction.py

transaction_begin_str = "START TRANSACTION;\n"
transaction_end_str = "COMMIT;\n"

insertStr = "INSERT INTO movies(title,year,length,movietype,studioname,producerC) VALUES"
value1_str = "('mymovietitle',"
# j
value2_str = ",120,'sciFic','MGM',100)"
# ,;
num_value = 10000
num_sql = 100
# 打开文件
f = open(r'C:\Users\Cxy\Documents\Navicat\MySQL\Servers\MySQL\newmoviedb\transaction.sql', 'w')  # 清空文件内容再写

# 将SQL语句写入文件
f.write(transaction_begin_str)
for i in range(1, num_sql+1):
    f.write(insertStr)
    for j in range(1, num_value):
        f.write(value1_str)
        f.write(str(i*num_value*10+j))
        f.write(value2_str)
        f.write(',')

    f.write(value1_str)
    f.write(str(i*num_value*10+num_value))
    f.write(value2_str)
    f.write(';\n')
f.write(transaction_end_str)

# 关闭文件
f.close()

参考リンク

https://blog.csdn.net/qq_22855325/article/details/76087138

https://segmentfault.com/a/1190000016867644

https://mp.weixin.qq.com/s?__biz=MzUxMTgyNTQ2MA==&mid=2247483757&idx=1&sn=e8f9728ef6cd12c3c87195fcd4c7eb01&chksm=f96c8236ce1b0b20753e278ade6e58351c3c3bd8d1160d4ab1a0a3a9597bf9ab75bbf1cf2a9e&token=1803387227&lang=zh_CN#rd

https://zhuanlan.zhihu.com/p/55538088

https://zhuanlan.zhihu.com/p/39850961


著者:臭い塩辛@

:ソース記入してくださいhttps://www.cnblogs.com/chouxianyu/を

議論し、共有することを歓迎します!


おすすめ

転載: www.cnblogs.com/chouxianyu/p/11696177.html