Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.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 对于变长的数据库表,有什么好的解决方案?_Mysql_Sql Server_Database_Performance_Architecture - Fatal编程技术网

Mysql 对于变长的数据库表,有什么好的解决方案?

Mysql 对于变长的数据库表,有什么好的解决方案?,mysql,sql-server,database,performance,architecture,Mysql,Sql Server,Database,Performance,Architecture,我将使用特定场景描述一个问题: 假设您创建了一个用户可以注册的网站, 注册后,他们可以互相发送私人信息 此网站允许每个用户维护自己的朋友列表, 并且维护一个被阻止的用户列表,他不想从中得到消息 现在的问题是: 想象一下,这个网站有数百万用户, 我们还假设每个用户在Friends表中有大约10个朋友,在Blocked Users表中有10个Blocked Users 好友列表表和被阻止的用户表将变得非常长, 但更糟糕的是,每当有人想向另一个人发送消息时,“X” 我们需要检查整个阻塞用户表,并查找用

我将使用特定场景描述一个问题:

假设您创建了一个用户可以注册的网站,
注册后,他们可以互相发送私人信息

此网站允许每个用户维护自己的朋友列表
并且维护一个被阻止的用户列表,他不想从中得到消息

现在的问题是:

想象一下,这个网站有数百万用户,
我们还假设每个用户在Friends表中有大约10个朋友,在Blocked Users表中有10个Blocked Users

好友列表表和被阻止的用户表将变得非常长,
但更糟糕的是,每当有人想向另一个人发送消息时,“X”
我们需要检查整个阻塞用户表,并查找用户“X”定义的记录—他阻塞的人

每次从一个用户向另一个用户发送消息时,这种对长数据库表的“扫描”对我来说效率很低

所以我有两个问题:

  • 这个问题的可能解决方案是什么?
    我不怕长数据库表,
    但我担心包含这么多用户数据的数据库表,
    这意味着每次都需要扫描整个表,只是为了从中为特定用户提取一些记录

  • 我想问的一个具体的解决方案:
    对于这个问题,我想到的一个解决方案是,每个注册到该网站的用户都将动态(并以编程方式)创建自己的“迷你数据库”
    这样,朋友表(Blocked Users表)将只包含他自己的记录 这使得扫描这些表非常容易,因为所有记录都是为他准备的。
    这种想法是否存在于MS-SQL Server或MySQL等数据库中?如果是,这是解决所述问题的好方法吗?
    (每个用户都将创建自己的小型数据库,当然还有一个主(通用)数据库,用于存储所有其他非特定于用户的数据)


  • 谢谢大家

    我的第一个想法是:

    分区可以让您以可伸缩的方式将其分解为更易于管理的部分。关于如何分手,你必须做出一些选择,但我相信这是你的正确道路

    关于表扫描,如果你有适当的索引,你应该在你的查询中得到搜索。你会想看看执行计划,以确定这一点


    对于每个用户都有迷你数据库,这是分区可以实现的。

    一开始我的第一个想法是:

    分区可以让您以可伸缩的方式将其分解为更易于管理的部分。关于如何分手,你必须做出一些选择,但我相信这是你的正确道路

    关于表扫描,如果你有适当的索引,你应该在你的查询中得到搜索。你会想看看执行计划,以确定这一点

    对于每个用户都有迷你数据库,这在某种程度上可以通过分区实现

  • 迷你数据库
    对于每个用户来说都是一个明确的禁区
  • 另一方面,一个单独的表只包含两列
    UserID
    BlockedUserID
    都是
    INT
    列,并且具有正确的索引,如果您明智地编写查询,这种方法就不会出错:)
  • 看看表分区,还有一个标准化良好的数据库,它具有良好的索引也会有所帮助
  • 此外,若您能够负担企业许可证表分区的费用,使用上一点中描述的表模式将使其成为一个非常好的、查询友好的数据库模式
  • 迷你数据库
    对于每个用户来说都是一个明确的禁区
  • 另一方面,一个单独的表只包含两列
    UserID
    BlockedUserID
    都是
    INT
    列,并且具有正确的索引,如果您明智地编写查询,这种方法就不会出错:)
  • 看看表分区,还有一个标准化良好的数据库,它具有良好的索引也会有所帮助
  • 此外,若您能够负担企业许可证表分区的费用,使用上一点中描述的表模式将使其成为一个非常好的、查询友好的数据库模式

  • 我会等待分区和创建迷你数据库的想法。您的数据库是否在不同的RAID驱动器上安装了数据、日志和临时文件?表上有聚集索引,搜索和联接列上有索引吗

    你有没有尝试过任何一种阅读查询计划,看看减速是如何发生的,在哪里发生的?在做基础工作之前,不要盲目地增加内存或尝试高级功能

    创建单独的数据库将成为维护的噩梦,并且(对于所有用户来说)执行您将来可能希望执行的查询类型将是一项挑战

    分区是SQL Server的一项出色功能,虽然在2014年,您可以拥有数千个分区,但您可能不会看到您正在寻找的巨大性能提升(除非您将每个分区放在单独的驱动器上)


    SQL Server对表的响应时间非常快(特别是对于具有10百万行的表(在您的情况下是用户表))。不要让主表太宽,响应时间会非常快

    我会等待分区和创建迷你数据库的想法。您的数据库是否在不同的RAID驱动器上安装了数据、日志和临时文件?表上有聚集索引吗
    UserAId  Int
    UserBId  Int
    RelationshipFlag  Smallint