我有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()
如何加快速度?