我有一種感覺,我會得到屠殺的問這個問題,但在這裏它去...MySQL的設計對於高頻計費系統
我有500萬周,每天的訂閱&期望/希望有5000萬的12個月。我需要非常迅速地續訂/收費。我試過了我能想到的循環索引&的每個排列,但是它的SELECT查詢仍然太慢。也許我的錯誤是MySQL設計,也許它是我使用MySQL的守護進程,也許是因爲我在使用MySQL--請讓我知道你的想法和/或建議。謝謝!
**訂閱表看起來像這樣**
- subscription_id(PK)
- subscriber_id
- 的service_id
- add_date
- current_start_date
- current_end_date
- bill_date(用於確保兩個線程不搶佔賬單在同一時間)
- last_successful_bill_date
- has_outstanding_balance
**錢,人欠,我的表看起來像這樣*
- ID
- subscription_id(UK)
- outstanding_balance
- next _bill_date
- number_bill_attempts
- (人相當數量的不總是付出,我給他們一點未付的訪問,同時我繼續嘗試法案,最終我切斷他們的服務雖然)
**開票守護程序看起來像這樣**
- 運行多線程在多臺機器:
- 對於每個服務
- stuffToBill [] =選擇東西ORDER BY next_bill_date FOR UPDATE LIMIT XXX;
- UPDATE東西SET next_bill_date =後來WHERE ID IN(stuffToBill [IDS])
- COMMIT
- 它們放在一個隊列計費工人
運行EXPLAIN顯示我使用體面的索引,但SQL的實質以及我在多臺服務器上運行相同的守護進程的事實使得它鎖定/通常超載了我的DBM上的I/O隊列。 DBM是高質量的硬件。
再次感謝您的建議!
你寫道:「我需要非常迅速地更新/清點這些。」對於您所描述的規模的系統而言,這是一個不足的性能規範。你需要弄清楚你真的需要這個系統的速度有多快。您需要確定哪些操作需要實時發生(在您的用戶等待期間)以及哪些操作(如果有的話)可以在隔夜計費運行中發生。 –
儘可能快,但如果我可以在幾個小時內完成循環,收益遞減。用戶不在等待。謝謝! – gfunk