为lastrowid加速MySQL多个单个插入

时间:2017-04-21 19:20:34

标签: python mysql

我有2张桌子,第一张:

+-----------------+---------------+------+-----+---------+----------------+
| Field           | Type          | Null | Key | Default | Extra          |
+-----------------+---------------+------+-----+---------+----------------+
| id              | bigint(20)    | NO   | PRI | NULL    | auto_increment |
| profile_id      | int(11)       | YES  |     | NULL    |                |
| landing_page_id | int(11)       | YES  |     | NULL    |                |
| keyword         | varchar(2083) | YES  |     | NULL    |                |
| unique_key      | varchar(200)  | YES  | UNI | NULL    |                |
+-----------------+---------------+------+-----+---------+----------------+

第二个看起来像:

+-----------------+------------+------+-----+---------+----------------+
| Field           | Type       | Null | Key | Default | Extra          |
+-----------------+------------+------+-----+---------+----------------+
| id              | bigint(20) | NO   | PRI | NULL    | auto_increment |
| profile_id      | int(11)    | YES  |     | NULL    |                |
| landing_page_id | int(11)    | YES  |     | NULL    |                |
| keyword_id      | int(11)    | YES  |     | NULL    |                |
| position        | int(11)    | YES  |     | NULL    |                |
| impressions     | int(11)    | YES  |     | NULL    |                |
| ctr             | float      | YES  |     | NULL    |                |
| clicks          | int(11)    | YES  |     | NULL    |                |
| metric_dates    | date       | YES  |     | NULL    |                |
+-----------------+------------+------+-----+---------+----------------+

这些内容由第一个表格的id与第二个表格中的keyword_id相关联。

目前,我正在插入每个keyword,然后返回lastrowid。然后,我收集所有keyword_ids(lastrowid)并在最后以5,000个批量插入时,将第二个表的数据一起批处理。

可以想象,最后的批量数据进展非常快,但单个插入需要一些时间。

单个插入物的范围可以从几千到一百万。

我为这些编写的类方法如下:

def insert_keyword(self, profile_id, landing_page_id, keyword, unique_key):
    try:
        sql = '''insert into keywords_v2
                (profile_id, landing_page_id, keyword, unique_key)
                values (%s, %s, %s, %s)
                on duplicate key
                update
                landing_page_id = values(landing_page_id)'''
        self.cursor.execute(sql, (profile_id, landing_page_id, keyword, unique_key))
        self.db.commit()
        return self.cursor.lastrowid
    except Exception as e:
        self.db.rollback()
    finally:
        self.db.close()

def insert_metrics(self, data):
    try:
        sql = '''insert into keyword_metrics_v2
                (profile_id, landing_page_id, keyword_id, position, impressions, ctr, clicks, metric_dates)
                values (%s, %s, %s, %s, %s, %s, %s, %s)'''
        self.cursor.executemany(sql, data)
        self.db.commit()
        return True
    except Exception as e:
        self.db.rollback()
    finally:
        self.db.close()

如何加快速度?

0 个答案:

没有答案