Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql表,带40+;柱_Mysql_Sql_Optimization_Multiple Columns - Fatal编程技术网

mysql表,带40+;柱

mysql表,带40+;柱,mysql,sql,optimization,multiple-columns,Mysql,Sql,Optimization,Multiple Columns,我的表格中有40多列,我必须再添加几个字段,如:当前城市、家乡、学校、工作、大学、拼贴 这些用户数据将为许多匹配的用户提取,这些用户是共同的朋友(与其他用户朋友加入朋友表以查看共同的朋友),并且没有被阻止,并且还不是用户的朋友 上面的请求有点复杂,所以我认为最好将额外的数据放在同一个用户表中以快速访问,而不是向表中添加更多连接,这样会使查询速度减慢。但我想听听你的建议 我的朋友告诉我添加额外的字段,这些字段不会作为序列化数据在一个字段上搜索 ERD图: 我当前的表格: 如果我加入更多表:

我的表格中有40多列,我必须再添加几个字段,如:当前城市、家乡、学校、工作、大学、拼贴

这些用户数据将为许多匹配的用户提取,这些用户是共同的朋友(与其他用户朋友加入朋友表以查看共同的朋友),并且没有被阻止,并且还不是用户的朋友

上面的请求有点复杂,所以我认为最好将额外的数据放在同一个用户表中以快速访问,而不是向表中添加更多连接,这样会使查询速度减慢。但我想听听你的建议

我的朋友告诉我添加额外的字段,这些字段不会作为序列化数据在一个字段上搜索



ERD图:

  • 我当前的表格:
  • 如果我加入更多表:


一些建议

  • 这个表和列没有问题
  • 遵循这种方法-将额外字段序列化为一个字段,而不是可搜索的字段
  • 创建另一个表并将大部分数据放在那里。(如果我已经有3个或3个以上的表要连接以提取用户的记录(例如,friends、user、check mutual friends),那么连接会变得更加困难)

  • 像往常一样——这要看情况而定

    首先,有一个问题,你并不真的想去那里

    其次,如果有很多列带有索引,那么在插入或更新时会对性能产生影响(尽管我不确定这对现代硬件是否重要)

    第三,大型表通常是所有似乎与核心实体相关的数据的倾卸场;这很快使设计变得不清晰。例如,您展示的设计显示了3个不同的“状态”类型字段(状态、is_admin和fb_account_verified)-我怀疑有一些业务逻辑应该将它们联系在一起(例如,管理员必须是经过验证的用户),但您的设计不支持这一点

    这可能是也可能不是问题——它是一个概念、架构/设计问题,而不是一个性能/工作的事情。然而,在这种情况下,您可以考虑创建表来反映有关帐户的相关信息,即使它没有X对多关系。因此,您可以创建“UsSeriPrror”、“UsRe凭据”,“用户\u fb”、“用户\u活动”,均由用户\u id链接。 这使得它更整洁,如果你必须添加更多与facebook相关的字段,它们就不会挂在表的末尾。但这不会使你的数据库更快或更具可扩展性。连接的成本可能可以忽略不计

    无论您做什么,选项2—将“很少使用的字段”序列化为单个文本字段—都是一个糟糕的主意。您无法验证数据(因此日期可能无效,数字可能是文本,而不是空值可能丢失),并且在“where”子句中的任何使用都会变得非常缓慢

    一种流行的替代方法是“实体/属性/值”或“键/值”存储。此解决方案有一些好处-即使架构更改或在设计时未知,也可以将数据存储在关系数据库中。但是,它们也有缺点:很难在数据库级别验证数据(数据类型和可空性),很难使用外键关系与其他表建立有意义的链接,查询数据可能会变得非常复杂——想象一下,找到状态为1、facebook_id为空且注册日期大于昨天的所有记录


    鉴于您似乎知道数据的模式,我认为“键/值”不是一个好的选择。

    我有一个一般性的意见给您

    想想看:如果你把超过10-12列的东西放在一个表中,即使把它们放在一个表中是有意义的,我猜你将在短期、长期和中期付出代价

    你的3个表的方法似乎比1个表的方法要好,但是考虑把它们变成5-6个表,而不是3个表,因为你仍然可以。

    当前
    当前位置
    当前链接
    用户表
    工作
    用户配置文件
    移动到一个新表中,主键为
    用户工作配置文件

    将区域设置信息从
    user profile
    移动到较新的
    USERPROFILELOCALE
    信息,因为它本质上是通用的

    是的,所有表中的所有泛型属性都应该是
    int
    ,而不是
    varchar
    。 例如,City需要移动到一个名为
    LIST
    \u的新表,其中包含
    cityid
    的城市。 您的属性
    city
    应该从
    varchar
    更改为
    int
    ,并指向城市列表中的
    cityid


    不要担心性能问题;您拥有的表越多,性能越好,因为您实际上是在将性能交给数据库提供程序,而不是自己掌握。

    我建议您运行一些测试。尝试两种方法并对其进行基准测试。没有人能给您一个明确的答案,因为您没有共享硬件配置、示例数据、示例查询、如何计划使用数据等。下面是一些您可能需要考虑的信息。

    按预期使用数据库

    关系数据库是专门为处理数据而设计的。正确使用它。正确编写后,在编写良好的架构中连接数据将表现良好。您可以使用EXPLAIN优化查询。您可以记录缓慢的查询并提高其性能。如果将所有内容都放在一个表中,数据库已经存在多年了性能,你不认为这会成为互联网上所有的热门话题,每个人都会这么做吗

    发动机类型

    随着行数的增长,插入将受到怎样的影响?您使用的是MyISAM还是InnoDB?您将受到最大的影响