2013-03-21 113 views
0

我正在构建一个具有以下结构的Web应用程序:我们有“客户”,每个客户都有自己的“用户”。 每个客户(包括他的用户和其他数据)与其他客户完全分开,并且他们之间没有共享数据。
而且每个“客户”有不同的子网站,并即将从那里(无论是他还是他的用户)将始终指单一customer.idMySQL体系结构优化 - MySQL集群

的数据库是建立在以下方式中的所有查询:

CREATE TABLE `customer` ( 
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT 
) ENGINE=InnoDB; 

CREATE TABLE `user` ( 
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `customerID` int(11) unsigned 
) ENGINE=InnoDB; 

CREATE TABLE `blogPost` ( 
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `userID` int(11) unsigned 
) ENGINE=InnoDB; 

我有很多像'blogPost'这样的表通过用户连接到客户。

共同询问将是类似的东西:

SELECT * 
FROM `blogPost` bp 
INNER JOIN `user` u 
ON bp.userID=u.id 
WHERE u.customerID = 324 

值得注意的是,这些连接是昂贵的,实际上是不必要的 - 因为我们进入一个子网站第二,我们只在数据感兴趣,定连接到特定的客户

所以问题是我该如何改进数据库?我对这个主题的了解越多,我就越困惑 -
是NDB(MySQL Cluster)存储引擎是否要走?
是否最好创建许多不同的数据库 - 每个客户一个? 也许增加一个冗余customerID字段到blogPost? 其他一些想法? MongoDB?!

+0

MySQL集群不会解决这个问题,我想知道你是如何得出这个想法的?有一个“SELECT *”,表格看起来很基本,但是关于选择特定的列而不是所有的东西? – geertjanvdk 2013-03-21 07:35:50

+0

表中有更多的字段 - 我只写了主键和外键......通常我只选择相关的列 - 这个查询只是一个例子来显示我试图摆脱的连接...我认为MySQL集群创建的行集群 - 以便每个客户和相关数据可以在他自己的集群中...也许这不是真的,虽然 - 我正在寻找任何解决方案,并不仅限于MySQL集群 – 2013-03-21 08:18:02

回答

0

首先让我们清除NDB引擎,MySQL Cluster/NDB不是这里的一种方式,它不仅不会提供任何有助于您实际情况的事情,而且会让它更加复杂。不仅需要大量的资源和至少3台数据库服务器才能运行NDB,例如JOIN在NDB中仍然不是很好 - 只是不要去那里。

连接表没有任何问题,RDBMS被设计为有效地完成此操作。如果你加入外键索引,这将是快速和高效的。你在这里试图做的是绝大多数Web数据库每天都要处理的事情,其中​​大多数人一起加入信息。

你可以给每个客户一个数据库,但相信我,这将大量增加你的数据库管理工作,如果你真的不需要为了商业原因而去掉这条途径,请不要。这是一个噩梦,当架构变化发生时,当客户x有性能问题,但客户y不 - 你最终会导致自己很多工作

+0

谢谢..我看到你在说,但我担心诸如消息(id,from_user,to_user,content)等表。 我们假设我只有1000个客户,每个客户平均拥有200个用户 - 我将每个用户的消息数量限制为100个。因此,我们拥有一个1000 * 200 * 100 = 20,000,000个记录的单个表。Isn'还有更多可扩展的方法可行吗? [不同客户的用户无法将消息发送到彼此] – 2013-03-21 09:13:54

+0

@gilads当您引入可伸缩性时,此问题开始扩展 - 您可以执行的操作包括分区/分片数据库,存档策略等。甚至可能有解决方案不涉及RDBMS - XML /无SQL等 – Steve 2013-03-21 15:29:46

0

所以问题是我该如何改进数据库?

是的,联接是昂贵的。特别是如果(如你的创建表语句所暗示的)你有没有索引。如果真的如此,那么你至少要在主键和外键上添加索引。 (我也注意到,根据你的设计,你不存储博客文章任何内容?真的吗?

共同询问会是这样......

真的吗?如果你的查询没有实现任何类型的过滤,那么你的应用程序有一些非常错误的地方。如果筛选实现为分页,并且数据很少被删除/更新,那么每个外键序列号将比全局自增分号更有效。

是它最好创建多个不同的数据库

绝对不是。

当然如果你有物理设备分布在不同磁盘上的I/O会提高I/O性能(假设你的数据库管理系统已经正确配置并且你的热数据集太大而无法放入内存)在这种情况下,您应该考虑在不同的磁盘上交叉索引和数据填充,或者使用内置的MySQL支持跨文件系统进行分片。

也许添加冗余客户ID字段到博客帖子

也许。

集群是可用性和性能的好主意的一个非常好的主意 - 但它带来了设置和保持运行所需的技能和时间方面的开销。您当然不应该在查看NDB - 在您调整单个实例的范围之后,在同步和异步复制中拥有一席之地。

首先添加索引,然后调整DBMS配置,然后尝试将customerID添加到blogpost中,然后查看文件在存储中的分布情况(这看起来像是SSD的一个很好的用例)。

+0

1.我不熟悉“查询过滤”的概念 - 不管你是什么意思? 2.您谈到了采用当前架构并用不同的方法进行调优 - 这很好,非常有用,但我担心消息(id,from_user,to_user,content)等表。 我们假设我只有1000个客户,每个客户平均有200个用户 - 我将每个用户的消息数量限制为100个。因此,我们有一个包含1000 * 200 * 100 = 20,000,000个记录的单个表。 Isn有没有更多的可扩展的方式去? [不同客户的用户不能发送消息给对方] – 2013-03-21 09:45:53