我们有一个分析应用程序,它允许用户运行许多不同的报告。我们有一个单一的主从 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')
这篇文章的解释是:
+----+-------------+--------------------------+--------+-----------------------------------------------------------------------------------+----------------+---------+----------------------------------------------+------+-------------+
| 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 |
+----+-------------+--------------------------+--------+-----------------------------------------------------------------------------------+----------------+---------+----------------------------------------------+------+-------------+