我有一个用户系统。每个用户都有个人资料。配置文件字段动态存储在数据库中。数据库看起来像:
CREATE TABLE profileFields(
profileField_id INT(255) AUTO_INCREMENT,
profileField_name VARCHAR(255),
profileField_value VARCHAR(255),
profileField_type VARCHAR(255),
profileField_isOptional TINYINT(1),
PRIMARY KEY(profileField_id)
);
CREATE TABLE users(
user_id INT(255) AUTO_INCREMENT,
user_username VARCHAR(255),
user_password VARCHAR(255),
user_email VARCHAR(255),
PRIMARY KEY(user_id)
);
CREATE TABLE profileValues(
profileValue_id INT(255) AUTO_INCREMENT,
profileValue_profileField_id INT(255),
profileValue_user_id INT(255),
profileValue_value VARCHAR(255),
PRIMARY KEY(profileValue_id)
);
我正在尝试获取包含所有个人资料字段和值的所有用户的列表。 我总共有50.000个用户和60个配置文件字段,产生了3.000.000个配置文件值。
检索此类列表的最有效方法是什么(并可能根据配置文件字段执行搜索)?
答案 0 :(得分:0)
“最有效”的方式总是难以识别。首先尝试这些:
将重复profileValues.profileValue_value中的许多值,因此您可以考虑创建一个包含所有可能字符串的表(可能是不断增长的列表)并将该字段转换为int。然后可以将其编入索引以进行非常有效的搜索,而无需执行3M行。
profileValues在profileValue_id上不需要PK;考虑(profileValue_user_id + profileValue_profileField_id)的PK。这将确保更快地将联接编入索引。