【问题标题】:What would be the most efficient way to query large amounts of dynamic profiles in MySQL?在 MySQL 中查询大量动态配置文件的最有效方法是什么?
【发布时间】:2016-02-05 14:54:58
【问题描述】:

我有一个用户系统。每个用户都有一个配置文件。配置文件字段动态存储在数据库中。数据库如下:

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 个配置文件值。

检索此类列表(并可能根据配置文件字段执行搜索)的最有效方法是什么?

【问题讨论】:

  • 请提供您要生成的数据示例。
  • 我看不出这些表是如何相互关联的。你应该怎么加入? 50.000 * 60 = 3.000.000,但这似乎只有两张桌子?
  • 所有配置文件都包含全部 60 个值吗?因为如果是这样,你不需要进一步分解它,
  • @jarlh 查看此信息,看起来 profileValues 是最上面的表,但我也看不到 60 x 50,000 部分
  • 3M 记录必须已经在 profileValues 中。

标签: mysql sql


【解决方案1】:

“最有效”的方法总是难以识别。初学者可以试试这些:

  1. profileValues.profileValue_value 中的许多值将重复,因此您可以考虑创建一个包含所有可能字符串的表(可能是不断增长的字符串列表)并将该字段转换为 int。然后可以为非常有效的搜索建立索引,而无需执行 3M 行。

  2. profileValues 不需要对 profileValue_id 进行 PK;考虑 (profileValue_user_id + profileValue_profileField_id) 的 PK。这将确保更快地为连接建立索引。

您还需要检查:What is the MAX number if I store int(255) in MySQL?

【讨论】:

    猜你喜欢
    • 2013-02-08
    • 2022-09-28
    • 2021-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多