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