【问题标题】:MySQL Design For High Frequency Billing SystemMySQL高频计费系统设计
【发布时间】: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


【解决方案1】:

您似乎正在使用选择/更新/提交机制来确定要计费的帐户,如下所示:

     SELECT stuff 
   ORDER BY next_bill_date 
 FOR UPDATE 
     LIMIT XXX;

    UPDATE stuff 
       SET next_bill_date = later
     WHERE id IN (stuffToBill[ids]);

    COMMIT;

您的 SELECT 语句可以通过添加一个可行的WHERE 子句来改进,该子句只选择即将到期的账单,或者通过其他一些标准。查看所有账单只是为了找到最旧的账单是没有意义的。像

  WHERE next_bill_date <= TODAY() + INTERVAL 30 DAYS

可能会成功。如果你做对了,SELECT 查询的复杂性就会降低。如果您正确索引 next_bill_date,您将可以使用索引。

您也可以尝试调整LIMIT BY xxxx 值的大小。您可能在这里使用了太大的值,并且您的更新速度非常慢。

最后,您需要考虑进行一些认真的 MySQL 和 InnoDB 调优。控制 RAM 使用等的预设参数通常不适用于像您这样的生产系统。

【讨论】:

  • 谢谢。我不得不简化查询,但它确实有一个 where 子句和账单日期的索引。我复制了各种其他机器的数据库,并排列了不同的查询和索引——但基准测试显示,在扩展到约 500 万行以上时,性能提升很小。对设计模式、内存缓存或其他聪明的想法有什么想法吗?再次感谢。
  • 缓存不会有帮助,因为您必须先读取然后再写入行。缓存有助于多次读取。设计模式:应该可以避免每次查询都扫描和排序所有行。
  • 谢谢 Ollie,对设计模式有什么建议吗?分区、更改代码等。再次感谢!
猜你喜欢
  • 2015-12-21
  • 2012-02-12
  • 1970-01-01
  • 1970-01-01
  • 2014-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多