【发布时间】:2013-10-01 22:13:46
【问题描述】:
我有一种感觉,我问这个问题会被宰杀,但是就这样……
我每天有 500 万订阅量,预计/希望在 12 个月内有 5000 万订阅量。我需要非常非常快地更新/计费这些。我已经尝试了我能想到的所有索引和循环排列,但它的 SELECT 查询仍然太慢。也许我的错误是 MySQL 设计,也许是我使用 MySQL 的守护进程,也许仅仅是因为我使用的是 MySQL - 请让我知道你的想法和/或建议。谢谢!
** 订阅表如下所示 **
- subscription_id (PK)
- subscriber_id
- service_id
- 添加日期
- current_start_date
- current_end_date
- bill_date(用于确保两个线程不会同时抢到账单)
- last_successful_bill_date
- has_outstanding_balance
** Money-people-owe-me table 看起来像这样 *
- 身份证
- subscription_id(英国)
- outstanding_balance
- next_bill_date
- number_bill_attempts
- (相当多的人并不总是付费,我在继续尝试计费的同时给了他们一段时间的无偿访问权限,但最终我切断了他们的服务)
** 计费守护进程如下所示 **
- 在多台机器上运行多线程:
- 对于每个服务
- stuffToBill[] = SELECT stuff ORDER BY next_bill_date FOR UPDATE LIMIT XXX;
- UPDATE stuff SET next_bill_date = later WHERE id IN (stuffToBill[ids])
- 提交
- 让他们排队等待计费工作人员
运行 EXPLAIN 表明我使用了不错的索引,但 SQL 的细节加上我在多个服务器上运行相同的守护程序这一事实使其锁定/通常使我的 DBM 上的 I/O 队列超载。 DBM 是优质硬件。
再次感谢您的建议!
【问题讨论】:
-
您写道“我需要非常非常快地续订/计费这些。”对于您所描述的规模的系统,这是一个不足的性能规范。你需要弄清楚你真正需要这个系统有多快。您需要弄清楚哪些操作需要实时进行(当您的用户等待时)以及哪些操作(如果有)可以在隔夜计费运行中进行。
-
尽可能快,但如果我可以在几个小时内循环播放所有内容,则收益会递减。用户没有等待。谢谢!
标签: mysql multithreading billing