我正在开展一个与网站访问者分析类似的项目。 它将被100个网站使用,每天平均有10,000到100,000页的浏览量,因此数据量将非常大。
我应该为每个网站使用带有websiteid的单个表还是单独的表?
对具有100个网站的实时服务进行更改,每个网站都有单独的表格,这似乎是个大问题。另一方面,性能和可伸缩性可能会成为这么大数据的问题。任何建议,意见或建议都是最受欢迎的。
答案 0 :(得分:8)
网站FK的一张表partitioned怎么样?
答案 1 :(得分:1)
我想说的是根据您的数据使用最有意义的设计 - 在这种情况下是一个大表。
记录将是相同的类型,具有相同的列,因此从数据库规范化的角度来看,将它们放在同一个表中是有意义的。索引使得选择特定行变得容易,尤其是当单个索引中的数据可以满足整个查询时(通常情况可能如此)。
请注意,访问者分析必然涉及许多操作,除了一次操作大量行之外,没有简单的优化方法 - 例如:计数,总和和平均值。像这样的资源密集型统计数据通常是预先计算和存储的,而不是实时获取。这是你想要考虑的事情。
答案 2 :(得分:1)
如果数据统一,请使用一个表格。如果您需要在所有网站上进行选择 有多个表是一个痛苦。但是,如果编写足够的脚本,则可以使用多个表。
您可以使用MySQL的MERGE存储引擎在表中执行SELECT(但不要期望良好的性能,并注意打开文件的Windows硬限制 - 在Linux中,您可能必须使用ulimit来提高限制。在Windows中无法做到这一点。
我已经将一个巨大的表分成了许多(数百个)表,并使用MERGE来进行SELECT。我做了这个,所以我可以执行每个小表的离线创建和优化。 (例如OPTIMIZE或ALTER TABLE ... ORDER BY)。然而,SELECT with MERGE的性能使我编写了自己的自定义存储引擎。 (描述http://blog.coldlogic.com/categories/coldstore/'>here)
答案 3 :(得分:1)
使用单一数据结构。一旦开始遇到性能问题,就有很多解决方案,比如你可以通过网站ID(也称为水平分区)对表进行分区,或者也可以使用复制。这一切都取决于读取与写入的比率。
但是为了开始,请保持简单并使用一个具有适当索引的表。您还可以确定是否需要交易。您还可以利用MyIsam或NDB等各种不同的mysql存储引擎(在内存集群中)来提升性能。此外,缓存在从数据库卸载负载方面起着非常好的作用。主要是只读且可以轻松计算的数据通常放在缓存中,缓存服务于请求而不是去数据库,只有必要的查询才会进入数据库。
答案 4 :(得分:0)
除非您遇到MySQL性能问题,否则请使用一个表。
这里没有人不能回答性能问题,你应该自己做性能测试,了解是否有一个大表就足够了。