商业Web应用程序 - 可扩展数据库设计

时间:2010-05-13 16:27:40

标签: database-design web-applications mysql scalability

我正在设计一套网络应用程序来跟踪科学实验室数据。每个实验室都有几个成员,每个成员都可以访问他们自己的数据和整个实验室的数据。因此,许多典型的查询将返回多个成员的记录(例如我的鼠标,乔的鼠标和莎莉的鼠标)。

我认为我的数据库已经很好地规范化了。我现在想知道如何确保用户可以有效地访问他们自己的数据和他们的实验室的数据集,当它们(希望)混合其他实验室的大量记录时。

到目前为止,我提出的是大多数表格将以两个字段结束:user_id和labgroup_id。任何SELECT语句的WHERE子句都将包含对其中一个id字段的适当引用(“... WHERE'labroup_id = n ...”或“... WHERE user_id = n ...”)。

我的问题是:

  1. 这是一种可以扩展到10 ^ 6或更多记录的方法吗?

  2. 如果是这样,在查询中使用这些字段的最佳方法是什么,以便最有效地搜索数据库的相关子集?例如查询的第一步是创建一个只包含labgroup数据的临时表吗?或者使用id,user_id和labroup_id字段的某种组合进行索引是否足够?

  3. 我非常感谢任何响应者。

1 个答案:

答案 0 :(得分:3)

对于10 ^ 6行,使用此方法应该会更好。我们目前使用的东西非常类似于混合客户数据,这些数据由帐户ID区分,有10 ^ 8行,并且在适度的硬件上完全没有性能问题。

确保您定义了涵盖user_id和labgroup_id的索引。

请记住,MySQL每个查询只能使用一个密钥。查看典型的查询模式。如果人们将在where子句中使用多个列,则构建包含频繁使用的列的复合键,这些列也提供了良好的区分(意味着帮助缩小行... ...是/否列是一个不好的键但是具有许多不同值的列常用于where子句可能是一个很好的候选人。)

启用MySQL慢查询日志(或获取商业查询分析器或它的30天试用版)并查看哪些查询需要很长时间。使用EXPLAIN命令确定正在使用的索引以及方式。如果特定查询频繁出现在慢查询日志中和/或执行时间很长,请考虑修改索引或添加新索引。

确保您的my.cnf已针对您的环境进行了适当调整。开箱即用的配置几乎总是很差。这是good guide

相关问题