我有一个请求需要在特定时间范围内多次处理,我的实现正在工作,但我的用户群每天都在增长,数据库的CPU负载和执行查询所用的时间每天都在增加
以下是请求:
SELECT bill.* FROM billing bill
INNER JOIN subscriber s ON (s.subscriber_id = bill.subscriber_id)
INNER JOIN subscription sub ON(s.subscriber_id = sub.subscriber_id)
WHERE s.status = 'C'
AND bill.subscription_id = sub.subscription_id
AND sub.renewable = 1
AND (hour(sub.created_at) > 1 AND hour(sub.created_at) < 5 )
AND sub.store = 'BizaoStore'
AND (sub.purchase_token = 'myservice' or sub.purchase_token = 'myservice_wait' )
AND bill.billing_date > '2022-12-31 07:00:00' AND bill.billing_date < '2023-01-01 10:00:00'
AND (bill.billing_value = 'not_ok bizao_tobe' or bill.billing_value = 'not_ok BILL010 2' or bill.billing_value = 'not_ok BILL010' or bill.billing_value = 'not_ok BILL010 3')
AND (SELECT MAX(bill2.billing_date)
FROM billing bill2
WHERE bill2.subscriber_id = bill.subscriber_id
AND bill2.subscription_id = bill.subscription_id
AND bill2.billing_value = 'not_ok bizao_tobe')
= bill.billing_date order by sub.created_at DESC LIMIT 300;
该请求在两个不同的服务器上执行,每个服务器处理一个特定的服务. 在每台服务器中,请求每分钟运行8次(持续约3小时) 8次中的每一次都有这样一条不同的时间线:
AND (hour(sub.created_at) > 1 AND hour(sub.created_at) < 5 )
我这样做是为了可以将我的用户群分成8个,并更有效地处理请求. 此外,我一次只需要处理300个用户,因为我必须 for each 用户呼叫的第三方服务器不是很稳定,有时可能需要很长时间才能做出响应
计费表统计了大约50.000.000个条目,以下是列和索引的模式:
Subscriber table is around 2.000.000, columns scheme and indexes:
And finally subscription table, 2.500.000 rows, scheme and indexes:
作为更多的信息,我在优化测试期间注意到,如果我在请求中添加了这样一个事实,即我想要的数据在特定ID上带有"BILLING_ID",它将运行得非常快.基本上,我认为最耗时的是解析50.000.000行表.
我确实(或者至少我试着)用时间来优化我的请求,以提高效率,但到目前为止,我有点坚持这样做.
MySQL版本为5.7.38
谢谢你的帮忙