объединить 3 запроса в один, SELECT / COUNT / INSERT - PullRequest
1 голос
/ 30 апреля 2020

Мне нужна помощь, чтобы оптимизировать мои 3 запроса в один.

У меня есть 2 таблицы, первая содержит список серверов обработки изображений, которые я использую, поэтому разные серверы могут одновременно обрабатывать разные задания, поэтому у меня есть поле с именем quota , как показано ниже.

Имя первой таблицы, " img_processing_servers "

| id | server_url  | server_key | server_quota |
|  1 | examp.uu.co | X0X1X2XX3X |      5       |
|  2 | examp2.uu.co| X0X1X2YX3X |      3       |

Вторая таблица регистрируется, если в данный момент на сервере выполняется задание

Вторая таблица, " img_servers_lock "

| id | lock_server  |      timestamp      |
|  1 |       1      | 2020-04-30 12:08:09 |
|  2 |       1      | 2020-04-30 12:08:09 |
|  3 |       1      | 2020-04-30 12:08:09 |
|  4 |       2      | 2020-04-30 12:08:09 |
|  5 |       2      | 2020-04-30 12:08:09 |
|  6 |       2      | 2020-04-30 12:08:09 |

По сути, я хочу добиться, чтобы мои серверы изображений не превышайте go максимальную квоту и cra sh, поэтому я хотел бы объединить 3 запроса:

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

SELECT * FROM `img_processing_servers` WHERE 

SELECT COUNT(timestamp) FROM `img_servers_lock` WHERE `lock_server` = id 

! if the count is < than quota, go ahead and register use

INSERT INTO `img_servers_lock`(`lock_server`, `timestamp`) VALUES (id_of_available_server, now())

Как мне go создать этот одиночный запрос?

Моя цель - защитить серверы изображений от перегрузки.

Ответы [ 2 ]

1 голос
/ 30 апреля 2020

Соедините две таблицы и поместите их в запрос INSERT.

INSERT INTO img_servers_lock(lock_server, timestamp)
SELECT s.id, NOW()
FROM img_processing_servers s
LEFT JOIN img_servers_lock l ON l.lock_server = s.id
GROUP BY s.id
HAVING IFNULL(COUNT(l.id), 0) < s.server_quota
ORDER BY s.server_quota - IFNULL(COUNT(l.id), 0) DESC
LIMIT 1

Предложение ORDER BY позволяет выбрать сервер с наиболее доступной квотой.

0 голосов
/ 30 апреля 2020

ОК, поэтому я столкнулся с небольшим дополнением, которое давало мне ошибку, и это было то, что s.server_quota нужно было добавить в GROUP BY, чтобы он работал в HAVING

INSERT INTO img_servers_lock(lock_server, timestamp)
SELECT s.id, NOW()
FROM alpr_servers s
LEFT JOIN img_servers_lock l ON l.lock_server = s.id
GROUP BY s.id, s.server_quota
HAVING IFNULL(COUNT(l.id), 0) < s.server_quota
ORDER BY s.server_quota - IFNULL(COUNT(l.id), 0) DESC
LIMIT 1

Еще раз спасибо, Бармар!

...