Запрос на обновление выполняется очень медленно mysql, когда более 1 миллиона записей - PullRequest
2 голосов
/ 18 января 2020

Запрос занимает больше часа.

Кто-нибудь может помочь с этим? заранее спасибо.

Мой запрос

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 голосов
/ 18 января 2020

Другие отметили, что ваш оператор UPDATE обновляет каждую строку в таблице. Это, по сути, занимает много времени. И из-за транзакции / отката в базе данных это займет много оперативной памяти и дискового пространства.

Вы не сказали нам, как вы определили свой индекс или индексы на expiration_date, поэтому этот ответ немного догадывается. В частности, если expiration_date не находится в своем собственном индексе или не является первым столбцом в составном индексе, этот ответ не будет работать очень хорошо.

Попробуйте использовать такой запрос UPDATE, чтобы обновить 1000 строк в время.

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

Повторяйте запрос, пока он не обновит больше строк. Завершение обновления все равно займет некоторое время, но оно не будет монополизировать таблицу и не будет генерировать обширные транзакции.

Внимание, не пытайтесь запускать более одного из этих запросов одновременно.

...