我正在设计一个非常简单的(在功能方面)但困难的(在可伸缩性方面)系统,用户可以互相发送消息。把它想象成一个非常简单的聊天服务。用户可以通过php页面插入消息。该消息很短并且具有收件人姓名。需要一些数据库模式设计的建议
在另一个php页面上,用户可以查看一次发送给他的所有消息,然后在数据库中删除它们。而已。这就是这个系统所需的全部功能。我应该如何去设计这个(从数据库/ php的角度来看)?
到目前为止,我有表是这样的:
- 字段1 - >消息(VARCHAR)
- 场2 - >收件人(VARCHAR)
现在对于SQL INSERT,我发现,无论数据库中的行数如何,所花费的时间都是不变的。所以我的send.php将有一个很好的保证返回时间。
但是拉下邮件,随着行数增加,我的pull.php将花费更长的时间!我发现sql select(和delete)会随着行增长而花费更长的时间,即使在我为添加了收件人字段的索引后,情况也是如此。
现在,如果只是简单的情况下,用户将不得不等待更长的时间,然后他们的消息被拉到PHP然后它会一直OK。但我担心的是,当每个pull.php服务时间花费很长时间时,php服务器将开始拒绝某些请求的连接。或者更糟糕的是服务器可能会死亡。
所以问题是,如何设计这样的尺寸?任何提示/提示?
PS。关于数字的一些估计:
- 用户数以5万开头并上升。
- 每个用户平均有大约10条消息存储在另一端可能会拉下来。
- 每个用户每天发送大约10-20条消息。
UPDATE从阅读到目前为止的答案:
我只想从pull.php不利于拉低少消息澄清。即使只是拉一条消息,桌子很大时也需要很长时间。这是因为该表的所有消息,所以你必须做一个选择是这样的:即使你改变它到该
select message from DB where recipient = 'John'
它没有太大的帮助
select top 1 message from DB where recipient = 'John'
所以从远答案看起来好像表越长,选择的速度越慢,或者稍微好一些,没有办法绕过它。如果是这样的话,我应该如何处理这个从PHP端?我不希望php页面在http上失败,因为用户会感到困惑,并最终变得像疯了一样令人耳目一新,这使得它变得更糟。
如果收件人的索引不工作,它是什么varchar(???)表中当前有多少行有这样一个简单的查询运行速度慢?此机器上有多少其他用户以及它是哪种类型的机器? – 2009-04-08 19:51:05
我必须猜测你的索引没有正确设置。否则,你的表现不会顺应这种趋势。 – 2009-04-08 20:00:33
如果是mysql,它不会从DB中选择消息,其中recipient ='John'LIMIT 1 ??? – 2009-04-08 21:00:24