我有一个与[[Mysql相关的问题,我对基本知识没问题,但我需要帮助将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 |
基本上我想要实现的是我的图像服务器没有超过最大配额和崩溃,因此我想结合的三个查询是:
选择至少一台未达到配额的可用服务器,然后为其插入锁定记录。
`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())
我将如何创建此单个查询?我的目标是确保映像服务器免受过载的影响。
感谢您的帮助!
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
子句使它选择具有最多可用配额的服务器。