这是基于这样的假设编写的,即仅当用户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 is
或it is not
, 在内存中构建一个全新的临时表。一旦在内存中完成了这个拷贝,它就会在新表上运行查询,然后将其丢弃。这就是为什么NOT IN
或__not_in
参数非常昂贵。这也是为什么RAND
分类太贵了。不仅如此,它们还极大地损害了扩展性。您的服务器只有这么多内存可供使用,如果它充满了执行这些排除查询的临时表,那么只有这么多人可以同时访问该站点,PHP工作人员将不得不等待轮到他们。