快速生成千万条mysql数据


目的

学习、测试mysql大数据场景,需要先生成大量数据。

思路

mysql官方文档说得很清楚。"load data infile"导入数据比insert要快20倍。所以我们先生成一千万条数据的文件。 然后将数据导入表中。

生成数据

假如有个用户表(id, username,password, age, sex),id是自动增长,我们现在需要生成username等信息 生成一千万条数据,速度还能接受,耗时236秒,文件大小315M。

import string
import random

def random_str(length=1):
    template = string.letters + string.digits
    chars = random.sample(template, length)
    return "".join(chars)

def generate_record():
    """
    username/password/age/sex
    """
    length = random.randint(6, 20)
    username = random_str(length)

    length = random.randint(6, 20)
    password = random_str(length)

    age = random.randint(10, 100)
    sex = random.choice([0, 1])
    return [username, password, age, sex]

def create_file(num=10000000):
    with open("user_data.txt", "w") as f:
        for i in range(num):
            row = generate_record()
            f.write(",".join(map(str, row))+"\n")

if __name__ == '__main__':
    import datetime
    start = datetime.datetime.now()
    create_file()
    end = datetime.datetime.now()
    cost = (end -start).total_seconds()
    print("cost: %s" % cost)
#一千万条,耗时236s,文件315M

导入

load data infile命令有安全限制,最好是把数据拿到mysql server端,再通过mysql -uxxx -pxxx进入命令,再导入。 我的虚拟机导入耗时57秒

load data infile "/user_data.txt" into table user
fields terminated by ','
lines terminated by '\n'
(username, password, age, sex);

其它方式

  • 测试工具sysbench sysbench是批量insert,性能比不上导入。但是它更接近实际场景

  • 存储过程 速度很快,但是不如用熟悉的脚本方便



上篇: 如何判断类是类 下篇: sysbench测试mysql性能瓶颈