pymysql中 execute 和 executemany 性能对比

一.性能对比

今天突然想测试一下, pymysql中exectue ,和 executemany 插入数据库的效率,
看看区别大不大.
pymysql 中 execute 和 executemany 性能对比

users表结构

CREATE TABLE `users` (                                                            
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `email` varchar(255) DEFAULT NULL,
  `password` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

import pymysql

# 数据库配置信息
SHOUFUYOU_USER_PROFILE_CONFIG = {
    'host': 'xxx.xxx.xxx.xxx',
    'port': xxxx,
    'user': 'xxxx',
    'password': 'xxxxxxx',
    'db': 'xxxxx',
    'charset': 'utf8',
}




def fn_timer(fn):
    """
    计算 fn 的运算时间
    :param fn:
    :return:
    """

    @wraps(fn)
    def function_timer(*args, **kwargs):
        start = now()
        result = fn(*args, **kwargs)
        logger.info(f'{fn.__name__} total running time {now() - start} seconds')
        return result

    return function_timer




@fn_timer
def test_execute(connection, sql):
    rows_count = 0
    with connection.cursor(pymysql.cursors.DictCursor) as cursor:
        for i in range(1000):
            rows_count += cursor.execute(sql, ('frank@python.org', 'test' + str(i)))
        connection.commit()

    return rows_count


@fn_timer
def test_execute_many(connection, sql):
    with connection.cursor(pymysql.cursors.DictCursor) as cursor:
        datas = [('webmaster@python.org', 'test' + str(i)) for i in range(1,1000)]
        rows_count = cursor.executemany(sql, datas)
        connection.commit()

    return rows_count


if __name__ == '__main__':
    insert_sql = "INSERT INTO `users` (`email`, `password`) VALUES (%s, %s)"
    connection = pymysql.connect(**SHOUFUYOU_USER_PROFILE_CONFIG)

    test_execute(connection, insert_sql)
    test_execute_many(connection, insert_sql)


Connected to pydev debugger (build 173.4127.16)
 test_execute total running time 33.28491401672363 seconds
test_execute_many total running time 0.12204098701477051 seconds

测试结果如下:

数据测试方法耗时s测试数据量
execute方法3.287100
executemany方法0.0930100
execute方法33.2841000
executemany方法0.1221000
execute方法67.56122000
executemany方法0.193722000
二. 总结

可以看出明显的区别, 如果需要批量插入数据库,还是用 executemany方法 这个和execute 不是一个数量级.
如果只是插入比较少的数量量 用 exectue 比较好点.


分享快乐,留住感动.2018-08-13 08:58:30 –frank

pymysql,Cursor对象的属性和方法如下: 属性: 1. description:元组类型,包含执行最后一次查询返回的结果集列信息的描述。每个元素是(name, type_code, display_size, internal_size, precision, scale, null_ok)的元组。其,name表示列名,type_code表示数据类型,display_size表示数据在控制台的显示大小,internal_size表示数据在内部存储的大小,precision和scale表示数据的精度,null_ok表示列是否可以为NULL。 2. rowcount:整数类型,表示最后一次执行execute()方法或executemany()方法影响的行数。 方法: 1. execute():执行一条SQL语句。如果语句是查询语句,则返回查询结果的行数;否则,返回None。 2. executemany():执行多条SQL语句。参数是一个SQL语句的列表和一个参数列表的列表。如果语句是查询语句,则返回查询结果的行数;否则,返回None。 3. fetchone():从结果集获取一条记录。如果结果集已经遍历完毕,则返回None。 4. fetchmany():从结果集获取多条记录。参数是一个整数,表示要获取的记录数。如果结果集已经遍历完毕,则返回一个空元组。 5. fetchall():从结果集获取所有记录。如果结果集已经遍历完毕,则返回一个空元组。 6. scroll():将结果集的游标移动到指定的位置。参数是一个整数,表示要移动的位置。如果位置为正数,则表示向前移动;如果位置为负数,则表示向后移动。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值