Set*_*win 5 mysql database indexing relational foreign-keys
我是一个拥有200多名用户的成长型公司的四人团队的一员.是时候对我们的专有软件进行大规模重构了,我们非常高兴能够构建一个理想的系统,我们知道它可以承受至少5年以上的增长.然而,我们正在使用关系数据库,虽然我们正在制作一些相当不错的设计,但我有一种迫在眉睫的感觉,即此产品可能会比我们希望未来更慢.
我担心的是我们对外键关系的使用.它们非常适合数据完整性,这就是我们与它们合作的原因.如果我们想要更改某人的用户名,则会在所有相关位置更改它.那很棒.问题是,我们不是 - 我们通过他们的ID相关联,因此唯一的主要好处是获得关系密钥索引所获得的性能.
所有这些指数堆积如山,给我一个红旗.我们有一些表只是链接表,有三个关系键.他们肯定有自己的位置,我们非常有信心减少我们将要进行的查询.但是,我接着想 - 我们有10,000行,其中10,000行,另一行10,000,我们想添加一行.巴姆!新指数*4.
这令人担忧.我们会陷入任何陷阱,经验丰富的个人提出的建议是什么?
您当前的系统有多快?设计一个好的数据库模式是整个应用程序的基础,如果我要在速度和设计之间做出决定,我会选择设计。有多种方法可以加速您的应用程序,这些方法与数据库本身无关。
如果您进行并行安装(使用新系统运行旧系统),您可以监视慢速查询日志并在早期阶段阻止任何初始缓慢问题。您还可以识别经常运行的查询并通过添加新索引或编辑现有索引来优化查询。
您还可以实现缓存层,这将大大加快您的应用程序的速度。缓存充当应用程序和数据库之间的一层,您可以在其中以易失但可快速访问的状态存储常用请求的信息。
另一种优化技术是纵向扩展(增加单台机器的物理容量)或横向扩展(通过复制在集群中添加更多机器)。我见过系统在具有 64GB 内存的机器上运行速度极快,有超过 1000 万条记录。因此,请确保您的设计包含物理容量。
您可以遵循一整套优化技术来确保数据库快速运行;远离文本列,不要使用 OR 运算符,远离 ORDER BY RAND(),并限制使用分组运算符,例如group by. 这些只是一些例子,因此请进行一些研究。为了使优化变得更容易,您可以使用诸如 MySQL 的解释之类的工具,它将确定在应用程序中运行时查询的痛苦程度。
我强烈推荐使用Percona 的MySQL 构建,因为它们经过高度优化并提供自定义功能。
听起来您和您的团队正走在正确的道路上,不要太担心设计复杂的系统。一些软件应用程序需要复杂的系统才能运行。真正的技巧是让复杂的系统易于使用,这样您就可以轻松地支持它并在未来扩展它。祝你好运。