Как оптимизировать запрос на обновление для нескольких строк, используя MySQL и PHP - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть таблица, в которой около 80 000 записей. Он имеет 4 столбца:

|   id   |  code  |  size |  qty |  
+--------+--------+-------+------+
|    1   |  4735  |   M   |   5  |
|    2   |  8452  |   L   |   2  |
    ...
| 81456  |  9145  |   XS  |   13 |

Столбец code уникален.

Мне нужно обновлять qty два раза в день.

Для этого я использую этот запрос:

UPDATE stock SET qty = CASE id 
                         WHEN 1 THEN 10
                         WHEN 2 THEN 8
                         ...
                         WHEN 2500 THEN 20
                       END
              WHERE id IN (1,2,...,2500);

Я разделяю запрос на обновление 2500 акций одновременно, используя PHP.

Здесь это (в секундах), сколько требуется для обновления 2500 акций:

[0]7.11
[1]11.30
[2]19.86
[3]27.01
[4]36.25
[5]44.21
[6]51.44
[7]61.03
[8]71.53
[9]81.14
[10]89.12
[11]99.99
[12]111.46
[13]121.86
[14]131.19
[15]136.94
[END]137

Как вы можете видеть, для обновления 2500 продуктов требуется от 5 до 9 секунд, что, я думаю, очень тихо.

Что я могу изменить, чтобы ускорить процесс?

Спасибо!

1 Ответ

2 голосов
/ 29 апреля 2020

Поскольку время увеличивается, по мере того, как вы продвигаетесь, я ожидаю, что вам понадобится индекс для поля id, поскольку он выглядит подозрительно, как будто он выполняет полное сканирование таблицы. Вы можете создать индекс примерно так:

CREATE INDEX my_first_index ON table(id);

(мне нужно добавить это как ответ, потому что я не могу комментировать, я знаю, что это больше комментарий !!)

** РЕДАКТИРОВАТЬ **

Я перечитал и вижу, что ваша проблема больше. Я все еще думаю, что есть шанс, что размещение индекса по идентификатору исправит это, но лучшим решением было бы иметь новую таблицу для сопоставления идентификатора и количества, давайте назовем ее qty_mapping

|   id   |  qty |  
+--------+------+
|    1   |   10 |
|    2   |   8  |
    ...
| 2500   |   20 |

. Индекс ID, а затем вы можете изменить свое обновление на

update stock set qty = (select qm.qty from qty_mapping qm where qm.id = stock.id)

Он должен иметь возможность обновлять целые 80 000 записей в кратчайшие сроки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...