And*_*sov 2 sql wordpress query-optimization
除了users表,Wordpress还有一个包含以下列的usersmeta表
无论行是否具有填充的meta_value,每个用户在usersmeta表中都有20行.也就是说,将始终存在的元行添加到users表中会不会更有效率?
我猜测更频繁地查询users表中的信息(例如user_id,username,pass),因此将这些行保持较小的效率更高.这是真的?表格分离还有其他原因吗?
它被称为实体属性值(EAV)数据模型,并允许将任意数量的属性分配给给定实体.这意味着每个用户可以使用任意数量的元数据.
默认情况下,wordpress设置了几个键(问题中有20个),但可以有任何数字.如果所有用户都有一千个元数据条目 - usermeta表中每个用户只有一千个条目 - 它没有(就数据库结构而言)对用户可以拥有的元数据条目数量的限制.它还允许一个用户拥有一千个元数据,而所有其他用户拥有20个并且仍然有效地存储数据 - 或其任何排列.
除了灵活性之外,使用这种结构还允许主用户表保持较小 - 这意味着更有效的查询.
使用EAV的替代方案包括:
权限是第一点的最大问题,授予一揽子访问权限来改变数据库表的模式并不是一个好主意,并且对于许多(如果不是大多数)wordpress安装(托管在wordpress.com或在db用户没有alter权限的共享主机上).Mysql还有4096列的硬限制和每行65,535字节.尝试在单个表中存储大量列最终会失败,从而创建一个查询效率低下的表.
将所有属性存储在序列化字符串中将使得通过元数据值进行查询变得困难且缓慢.
Wordpress与mysql紧密相连,因此更改数据存储区不是一个现实的选择.
如果您没有使用任何/多个插件,那么您可能会在usermeta表中为每个用户提供一定数量的行,但通常您添加的每个插件可能需要为用户添加元数据; 添加的数字可能不是很简单,这些数据存储在usermeta表中.
add_meta_user的文档可以为数据库以这种方式构造的原因添加一些清晰度.如果你把这样的代码放在某个地方:
add_user_meta($user_id, "favorite_color", "blue");
Run Code Online (Sandbox Code Playgroud)
它将在usermeta表中为给定的user_id创建一行,而无需向主用户表添加列(favorite_color).这样可以轻松地按喜欢的颜色查找用户,而无需修改users表的架构.