最佳实践?-将多个值保存为序列化数据/按行/专用表保存每个值

时间:2021-07-29 作者:Elv1s

对于每个用户,应保存以下内容:

用户id标签/标签id(例如1,2,3,4,…)

  • 首先看到的时间戳(对于每个标签)
  • 最后看到的时间戳(对于每个标签)

      • 我想到的选项:
        1. 每个用户一行
          每个用户一行,包含meta\\u键(例如“User\\u tags\\u data”)并将数据保存到meta\\u value字段
          标记和关联的时间戳以序列化方式保存。因此,这将导致(多个标记+时间戳)组合,所有组合都保存在一个序列化值中


          每个用户有多行,每个用户将有多行(取决于分配给用户的标签数量)。对于每个分配的标记,将有一行带有专用meta\\u键(例如“user\\u tag\\u 1\\u data”)数据保存到meta\\u value字段
          时间戳以序列化方式保存。


          在数据库中创建一个单独的/专用的表来保存数据,并且根本不使用WP表。

          数据的使用:用户内容限制数据用于检查(登录的)用户是否具有与(第一次看到/最后一次看到)时间戳相结合的适当标记,以查看其是否在帖子发布日期之前或之后。根据这些值,用户将有权访问或无权访问他试图打开/查看的帖子

          目前每周约有1万名用户登录,主要是在发布新内容并通过通知/电子邮件通知用户之后
          因此,有%的用户将登录并尝试同时打开/访问新发布的帖子,因此并发用户。虽然通知/电子邮件只发送给那些拥有正确访问权限(标签和时间戳)的人,但当用户试图打开/访问帖子时,它仍然需要验证<该名单增长迅速,预计年底将达到2-4万人

          用户仪表板,帖子列表-可以/不能访问
          当用户登录时,显示他有权访问的帖子列表和他无权访问的帖子列表
          仪表板中显示的列表可能仅限于5-25篇帖子(按日期/随机排序),但会有一个链接,用于在新页面或灯箱/模式中加载所有(可访问/不可访问)帖子

          ---编辑/结束---

          在保存数据(由多个值组成)时,什么是最佳做法?我也在问性能/速度,因为有很多用户,它可以在大量数据中解析。

          E、 25k个用户,每个用户平均有20个标记,可能会产生500k行,我想这可能会影响数据库查询性能。

          我期待着您的来信
          (免责声明,我是初学者…)

1 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

这是基于这样的假设编写的,即仅当用户ID已知时才会检索此数据,并且该用户的数据总是完整的。If any kind of filtering is needed, if you need to filter users themselves by this data, then this answer will no longer apply.

每个用户一行

只有在获取整个数据并在PHP中进行处理时,此操作才有效。在数据库中序列化数据是个坏主意。

每个用户多行

这与每个用户一行的速度一样快,其优点是查询更好,数据更容易处理始终使用此选项而不是上一个选项

单独的表格

这将与前3个选项一样快

大行数焦虑,我想你已经使用过依赖后元查询的网站,并注意到它们越大,速度越慢。这并不是因为在一个表中有很多行会比较慢。数据库的设计方式可以处理数百万行,额外行的性能降低不足以解释您的问题。

相反,问题在于查询。有些查询很快!E、 g.当您已经知道密钥和用户ID时,查找元值的速度会快得惊人。部分原因是WP获取用户或批量发布元数据以节省时间并将其存储在WP_Cache (这也是为什么对象缓存有如此大的不同),但主要是因为这些表是为这些查询设计的,并且有索引。在执行查询时,数据库不会扫描表的每一行,这是数据库在最坏情况下作为最后手段所做的事情。

由于做出错误的数据存储决策,并且运行查询表不是为之设计的,因此大型表的查询速度会变慢。

因此,在一个有10个用户的站点上,该查询将查找所有具有该值的meta的用户ABC 会很快的get_user_meta( 1, \'xyz\' true )\'. 但在一个拥有100万用户的网站上,get_user_meta 将稍微慢一点,但该查询将查找具有ABC 将嘎然而止。

禁止/排除

用户仪表板,帖子列表-可以/不能访问

同样,当你问not 样式查询。通过这样做,数据库必须逐行评估每一行,以测试it isit is not, 在内存中构建一个全新的临时表。一旦在内存中完成了这个拷贝,它就会在新表上运行查询,然后将其丢弃。这就是为什么NOT IN__not_in 参数非常昂贵。这也是为什么RAND 分类太贵了。不仅如此,它们还极大地损害了扩展性。您的服务器只有这么多内存可供使用,如果它充满了执行这些排除查询的临时表,那么只有这么多人可以同时访问该站点,PHP工作人员将不得不等待轮到他们。

相关推荐

Show content from database

这是我在Wordpress StackExchange上的第一篇帖子,所以请温柔一点。我在WordPress工作了一段时间,但更多的是作为前端开发人员,而不是太多的后端开发人员。我有在Joomla工作的背景(不要对我不利……)我正在从事一个当前的项目,其中一个API正在将数据注入数据库,WordPress网站有权访问的内容(尚未决定是WordPress数据库还是外部数据库。数据基于艺术品,因此各种数据与每件艺术品相关,还需要搜索/筛选选项来查看数据库中的各种数据。我的问题是,我如何获取数据以显示在网站前端