2013-04-30 54 views
0

我們有一個分析應用程序,它允許用戶運行多個不同的報告。我們有一個主 - 從MySQL數據庫設置。在沒有用完MySQL連接的情況下存儲網站訪問者

其中一個,我們跟蹤是我們的客戶網站的訪問者的事情。每當訪問者登陸我們的客戶網站時,我們會在主數據庫中寫入各種信息。問題在於,在高峯流量時間(通常在晚上),我們正在使用MySQL數據庫連接。我們知道我們需要以某種方式對正在撰寫的訪問者數據進行分類然而,我們用來銷售本產品的一件事是,您可以在網站上看到訪客數據。我們可以允許網站上的訪問者與報告中可用的數據之間有短暫的延遲(1-2分鐘)。

什麼是分期訪問者數據的最佳方式?是否有另一種方法可以擴展?

這是造成鎖定的查詢是:

SELECT VisitID,VistSourceID 
FROM visitorvisits 
LEFT JOIN visitornumbers 
ON VinuVlviID=VlviID 
WHERE vistNosID='12345' AND 
VistCampaignID='1' AND 
('2013-04-03 14:30:48' >= DATE_ADD(VistDateStart, INTERVAL VistTimeStart HOUR_SECOND)) 
AND ('2013-04-03 14:30:48' <= DATE_ADD(VistDateEnd, INTERVAL VistTimeEnd HOUR_SECOND) 
OR VistStatusCode='1') 

這個stament的expalin是:

+----+-------------+--------------------------+--------+-----------------------------------------------------------------------------------+----------------+---------+----------------------------------------------+------+-------------+ 
| id | select_type | table     | type | possible_keys                  | key   | key_len | ref           | rows | Extra  | 
+----+-------------+--------------------------+--------+-----------------------------------------------------------------------------------+----------------+---------+----------------------------------------------+------+-------------+ 
| 1 | SIMPLE  | visitornumbers   | ref | idx_vistNosID,idx_visitNosVisitID              | idx_vistNoID | 4  | const          | 4527 | Using where | 
| 1 | SIMPLE  | visitorvisits   | eq_ref | PRIMARY,idx_VistCampaignID,idx_VistStatusCode,idx_VistCampaignID_VistDateStart_VistVistorID | PRIMARY  | 4  | mhdblive.visitorvisits.visitNosVisitID | 1 | Using where | 
+----+-------------+--------------------------+--------+-----------------------------------------------------------------------------------+----------------+---------+----------------------------------------------+------+-------------+ 
+0

你的網站是用什麼書寫的? PHP?紅寶石? Java的? – 2013-04-30 10:26:13

+0

我們的應用程序是用PHP編寫的。 – mh1 2013-04-30 10:31:54

回答

0

你完全關閉每次連接?

如果你並沒有這樣就可以避免用完連接的話,我懷疑的解決方案將是混亂的。

可能寫信息到一個固定的地方,如文本文件,並有運行每隔30秒左右,以處理該文件(S)的內容的cron作業。

或者可能是一個HTTP調用到您網站上的一個頁面,存儲在一個會話變量數組的數據,然後擦上每隔30秒左右的表會話變量並存儲所有的細節。

+0

連接應該每次完全關閉。 – mh1 2013-04-30 12:47:23

+0

您的最大連接數設置爲多少?默認值是100我認爲,只要連接被釋放(假設沒有人使用持續連接),它應該覆蓋大部分相當繁忙的網站。 – Kickstart 2013-04-30 12:56:42

+0

我們的最大連接數是150(加1根)。 – mh1 2013-04-30 14:52:34

0

首先,值得檢查連接管理錯誤的應用程序 - 取決於你如何連接MySQL(提示:PDO幾乎是目前的標準),可能你的代碼保持連接打開的時間超過了你需要的時間 - 特別是如果您在應用程序中的某個地方有長時間運行的進程,這些進程在數據庫連接運行時保持打開狀態

下一頁 - 檢查你的MySQL服務器配置爲接受的連接數;在Linux上,具有足夠的RAM,您應該能夠支持數千個打開的連接;如果您的應用程序僅在需要它們時纔打開連接,則這大致轉換爲您支持的併發頁面請求的數量(並且每個頁面請求應以毫秒爲單位執行)。有可能你達到了這個水平,但是通常情況下,你還有其他瓶頸(通常是數據庫CPU)。

如果這兩件事情都像它們將要獲得的那樣好,那麼標準的解決方案就是創建一個異步基礎架構 - 您的網頁存儲將數據庫記錄寫入某個描述隊列的請求,然後繼續;第二個進程查看隊列並以任何最佳方式處理寫入。

您可以爲此自行製作解決方案,或者您可以使用衆多隊列服務器之一(例如Beanstalk,Amazon SQS,RabbitMQ)。

相關問題