当超过100万条记录时,更新查询在mysql上的执行速度非常慢

时间:2020-01-18 11:37:54

标签: mysql bulkupdate

查询需要一个多小时。

任何人都可以帮忙吗?预先感谢。

我的查询是

UPDATE coupons SET expiration_date='2020-06-06'

我的表格结构

+-----------------------+--------------------------------------------+------+-----+---------+----------------+
| Field                 | Type                                       | Null | Key | Default | Extra          |
+-----------------------+--------------------------------------------+------+-----+---------+----------------+
| id                    | int(11) unsigned                           | NO   | PRI | NULL    | auto_increment |
| vendor_id             | int(11)                                    | NO   | MUL | NULL    |                |
| type                  | enum('food','shopping','home','lifestyle') | NO   |     | NULL    |                |
| title                 | varchar(255)                               | NO   | MUL | NULL    |                |
| slug                  | varchar(255)                               | YES  |     | NULL    |                |
| thumbnail_image       | varchar(600)                               | YES  |     | NULL    |                |
| coupon_name           | varchar(255)                               | NO   |     | NULL    |                |
| expiration_date       | date                                       | YES  | MUL | NULL    |                |
| discount_type         | enum('d','p')                              | YES  |     | NULL    |                |
| discount_rate         | double(7,2)                                | YES  |     | NULL    |                |
| code_type             | enum('i','c','u','b')                      | NO   |     | NULL    |                |
| code                  | text                                       | YES  |     | NULL    |                
| created_at            | datetime                                   | YES  |     | NULL    |                |
| updated_at            | datetime                                   | YES  |     | NULL    |                
+-----------------------+--------------------------------------------+------+-----+---------+----------------+

1 个答案:

答案 0 :(得分:1)

其他人指出,您的UPDATE语句更新表中的每一行。从本质上讲,这需要很长时间。并且,由于数据库中的事务/回滚,将占用大量RAM和磁盘空间。

您没有告诉我们如何在expiration_date上定义索引,所以这个答案有点猜测。具体来说,除非expiration_date在其自己的索引中或在复合索引的第一列中,否则该答案的效果将不佳。

尝试使用这样的UPDATE查询,一次更新1000行。

UPDATE coupons 
   SET expiration_date='2020-06-06'
 WHERE expiration_date <> '2020-06-06'
 LIMIT 1000

重复查询,直到不再更新任何行。完成更新仍需要一段时间,但不会垄断该表,也不会产生大量交易。

警告,不要一次运行多个查询。

相关问题