我有大量记录(10,000,每天都在增加),基本上是一个包含大量数据的报告。所有这些数据都只是数字测量,需要存储。
问题是,这些测量有200多个,我需要查询它们。例如,“对于2012年1月至3月期间创建的报告,每个性别的平均身高是多少,按权重排序?”为了能够灵活地查询任何测量,每个测量都需要自己的列。
现在,我将每个字段存储在JSON数组中,并将其存储在单个列中。这对于我没有完成查询工具的开发部分来说很好,但是我需要尽快构建它...从理论上讲,我可以从数据库中提取所有记录并使用PHP对它们进行排序(当它们是对象时)或数组),但在处理这么多行时,这似乎是不必要的复杂和危险。
MySQL的大型(200+)列表是否存在数万行的问题,无论是性能还是数据完整性?或者,有没有其他选择来拉所有并使用某种服务器端语言对其进行排序?
关于我的数据的一些随机信息:
答案 0 :(得分:1)
将它们全部分开存放。 Mysql每个表的限制为4096列,每行限制为65536个字节。你不会用大多数数字数据和一些字符串来达到目的。
你不应该在php中进行任何数据操作,这就是sql闪耀的地方。在宏观方案中,200列和10,000行相当小,只需正确索引表,即使不这样做,性能也应该没问题。
答案 1 :(得分:1)
好的,我看到你的问题,并且在数据库专家(可能是短暂的)缺席的情况下,我会给你我的看法。
为了理智而分解您的数据。让我们说你正在存储人们的信息。 1表中不需要200列。您应该将它们拆分并在许多表中包含多个列。 e.g。
tblGeneralCharacteristics:
- colEyeColor
- colHairColor
- colHeight
- colWeight
tblInterests:
- colFaveColor
- colFaveSport
tblRelationships
- colMother
- colFather
- colBrother
- colSister
这种方式要好得多。在计算上我怀疑它很重要。显然,对于每个查询,您获得的数据较少,因此对于某些报告(您可能不需要获取所有数据,或遍历所有数据),它可能会更快(尽管如果您正确地索引数据库,那么它应该没有不成问题。
到下一期。数据库中的记录数量。如果10,000开始变得有点大,那就是开始缓存的时候了。
现在,就我而言,没有正确或错误的方法来缓存数据。你需要的是你需要的。因此,举例来说,在你的问题中,你提到了Jan和amp;之间记录输入的平均权重高度。 2012年3月。好吧......你可以编写一个cron脚本来计算当月输入的所有记录的平均权重,并将其存储在某个不同的表中。然后,当您开始创建报告时,您只需要获取Jan,Feb和amp;的值。三月和平均他们......这更容易。您可以在几百行上执行cron查询(无论需要多长时间),而不是对可能数千行进行计算查询,然后实际报告只查询3行。
另一个技巧是,你可以在SQL中做的计算越多越好。如果你想平均字段/记录,或总计一些东西,然后用你的SQL查询发送它。 SQL服务器将执行计算并返回结果,而不是返回大量数据进行筛选。我知道这并不总是容易/有用,但是你可以越多地让SQL做得更好。
希望这会有所帮助。就像我说的那样,我确信数据库专家很想给你一些更有见地的建议。 :)