【问题标题】:Commercial web application--scalable database design商业网络应用——可扩展的数据库设计
【发布时间】:2011-02-19 04:28:32
【问题描述】:

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

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

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

我的问题是:

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

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

我提前非常感谢任何响应者。

【问题讨论】:

  • mysql 已经内置了一个查询优化器。您还在使用 whit pkeys(索引),所以这应该不是问题。
  • @Ben:不像例如MS SQL、MySQL 不会建议您应该创建索引以提高性能。了解 MySQL 如何使用主键和索引以及如何使用可用的性能测量工具来确保高性能非常重要。

标签: database-design web-applications mysql scalability


【解决方案1】:

使用这种 10^6 行的方法应该会更好。我们目前使用与混合客户数据非常相似的方法,这些数据由 10^8 行的帐户 ID 区分,并且在普通硬件上完全没有性能问题。

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

请记住,MySQL 每次查询只能使用一个键。查看您的典型查询模式。如果人们将在 where 子句中使用多个列,则构建包含大量使用的列的复合键,这些列也提供良好的区分(意味着帮助缩小行的范围……是/否列是一个糟糕的键,但一个具有许多不同值的列在 where 子句中经常使用可能是一个不错的候选)。

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

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

【讨论】:

  • @Rob:还有一件事...... MySQL可以从左到右使用复合索引的一部分,例如如果人们通常会使用 labgroup_id 进行查询,但有时也会使用另一列进行查询,例如(在此处创建一个)experiment_id,您应该创建一个复合索引 labgroup_id+experiment_id。当 WHERE 子句中只有 labgroup_id 时,MySQL 可以使用复合索引。另一方面,如果 where 子句只使用了没有 labgroup_id 的experiment_id(它可以从左到右读取复合键),MySQL 就不能使用该索引。
猜你喜欢
  • 2011-09-01
  • 1970-01-01
  • 2012-12-05
  • 1970-01-01
  • 2011-02-14
  • 2012-01-06
  • 2015-07-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多