我们可以获取运行基本优化技术的列表(从建模到查询,创建索引,查询优化的视图)。每个答案都有一份列表,这是一项技术,这是很高兴的。作为一名业余爱好者,我会发现这非常有用,谢谢。

为了不太含糊,假设我们使用的是Mysql或Oracle等维护式DB,并且DB将包含〜10张桌子上的500,000-1M左右的记录,有些具有外键对照,所有这些都使用该记录最典型的存储引擎(例如:MySQL的InnoDB)。当然,诸如PK之类的基础知识也是定义的,也是FK的违反。

有帮助吗?

解决方案

了解索引,并正确使用它们。 一般而言*,请遵循以下准则:

  • 每个表都应有一个群集索引
  • 用于过滤器和类型的字段是索引的好候选者
  • 更多的 可选择的 字段是索引的更好候选人
  • 为了在关键查询上进行最佳性能,请设计这些查询的“覆盖索引”
  • 确保您的索引实际上正在使用,并删除那些没有的索引
  • 如果您的桌子有15个字段,并且您制作了15个索引,每个索引只有一个字段,那么您就做错了:)

*如果您知道自己在做什么,这些规则有一些例外。我的经验是Microsoft SQL Server,但我认为大部分建议仍然适用于不同的RDM。

其他提示

IMO,到目前为止,最好的优化是使数据模型符合其构建的问题域。如果不这样做,则最终的症状是难以写的或复杂的查询,以获取所需的信息,并且通常在针对数据库构建报告时会自行自行自身。因此,在设计数据库时,有助于对用户需要从系统中想要的信息的类型和性质(例如报告)有所帮助。

在谈论数据库设计时,请查看数据库归一化,例如Wikipedia文章: 正常形式.

如果您的设计良好,并且仍然需要优化性能,请尝试 非正式化.

如果您有有效关系模型不涵盖的特定需求,请查看该术语涵盖的其他模型 nosql.

一些查询/模式优化:

  • 使用不同或组时要注意。我发现,许多新开发人员将使用存在的语句或派生查询可以更有效地重写它的地方。

  • 请注意左联盟。我经常发现新的SQL开发人员会忽略到位的架构,并使用左连接实际上是没有必要的。例如:

Select
From Orders
    Left Join Customers
        On Customers.Id = Orders.CustomerId

如果orders.customerid是所需的列,则不必使用左联接。

  • 成为新功能的学生。当前,MySQL不支持共同表达式,这意味着某些类型的查询很麻烦,并且写作可能比支持CTE的较慢。但是,这不会永远正确。跟上MySQL中的新语法功能,该功能可用于使现有查询更有效。

  • 您不必到处使用替代钥匙。可能会有更适合智能密钥的表(例如美国州缩写,货币代码等),这将使开发人员能够避免在许多情况下进行其他加入。

  • 如果可能,请找到将数据归档到OLAP或报告服务器的方法。您可以制作生产数据的越小,运行速度就越快。

简洁地对您的问题建模的设计始终是一个良好的开始。过度概括数据模型会导致性能问题。例如,我听说过有关使用RDBMS作为愚蠢的“名称/值”商店的项目努力的项目的报道,并且由此产生的性能令人震惊。

一旦制定了良好的设计,然后使用RDBMS提供的工具来帮助其实现良好的性能。单字段PK(无复合材料),但复合业务密钥作为具有独特约束的索引,使用适当的数据类型,例如使用适当的数字类型用于数字值,而不是char或类似。还应考虑RDBMS正在运行的硬件的物理属性,因为大部分查询时间通常是磁盘I/O-但是当然不要将其视为理所当然 - 请使用Profiler来找出时间到底。

根据更新/查询比率,实现的视图/索引视图可用于改善缓慢运行查询的性能。穷人的替代方法是使用触发器来调用一个程序,该程序以缓慢的,不经常变化的视图而填充桌子。

查询优化有点像黑色艺术,因为它通常依赖于数据库,但是这里给出了一些经验法则 - 优化SQL.

最后,尽管可能在您的问题的预期范围之内,但请在应用程序中使用良好的数据访问层,并避免诱惑自己滚动您自己的诱惑 - 肯定可以针对所有主要语言进行测试和性能实现。在数据访问层,中间层和应用层的使用中使用缓存可以有助于大大提高性能。

使用 较少查询 只要有可能。使用“加入”,然后对表格进行分组,以便单个查询可为您提供结果。

一个很好的例子是 修改的预订树横向 (mptt)在单个查询中订购的所有树节点父母。

采用整体优化方法。

考虑慢速磁盘,网络延迟,缺乏内存和服务器负载的影响。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top