我们能否列出一些基本的优化技巧(包括从建模到查询、创建索引、视图到查询优化等)。如果每个答案只提供一种技术,那将非常有用。作为一个业余爱好者,我会觉得这很有用,谢谢。
为了避免过于笼统,让我们假设我们正在使用像MySQL或Oracle这样的主流数据库,并且该数据库将在大约10个表中包含50万至100万条记录,一些表具有外键约束,并且都使用最典型的存储引擎(例如:MySQL的InnoDB)。当然,基础知识,如主键和外键约束已定义好。
我们能否列出一些基本的优化技巧(包括从建模到查询、创建索引、视图到查询优化等)。如果每个答案只提供一种技术,那将非常有用。作为一个业余爱好者,我会觉得这很有用,谢谢。
为了避免过于笼统,让我们假设我们正在使用像MySQL或Oracle这样的主流数据库,并且该数据库将在大约10个表中包含50万至100万条记录,一些表具有外键约束,并且都使用最典型的存储引擎(例如:MySQL的InnoDB)。当然,基础知识,如主键和外键约束已定义好。
学习有关索引,并正确使用它们。通常来说,遵循以下准则:
*如果您知道自己在做什么,则这些规则有一些例外。我个人的经验是Microsoft SQL Server,但我认为大部分建议都适用于其他关系数据库管理系统。
在我看来,最好的优化方法是让数据模型适合其所构建的问题域。如果不适合,则会导致编写困难或复杂的查询以获取所需信息,通常在针对数据库构建报告时会出现这种情况。因此,在设计数据库时,有一个关于用户需要系统提供哪些类型和性质的信息(例如报告)的想法是有帮助的。
一些查询/模式优化:
在使用 DISTINCT 或 GROUP BY 时要注意。我发现很多新开发人员会在不需要使用 DISTINCT 的地方使用它,或者可以使用 Exists 语句或派生查询更有效地重写它。
注意 Left Join。我经常发现新的 SQL 开发人员会忽略现有的模式,并在不必要的情况下使用 Left Join。例如:
Select
From Orders
Left Join Customers
On Customers.Id = Orders.CustomerId
学习新特性。目前MySQL不支持公共表达式,这意味着某些类型的查询比使用CTEs编写更加繁琐且可能更慢。然而,这种情况不会永远存在。了解MySQL中的新语法特性,可以用来使现有查询更加高效。
并非在所有地方都需要使用代理键。可能有一些表更适合使用智能键(例如美国州缩写、货币代码等),这将使开发人员在许多情况下避免使用额外的连接。
如果可能,找到将数据归档到OLAP或报告服务器的方法。生产数据越小,运行速度就越快。
尽可能使用较少的查询。使用“JOIN”,并对表进行分组,以便单个查询给出结果。
一个很好的例子是使用修改的先序树遍历(MPTT)在单个查询中按顺序获取树节点的所有父节点。
采用全面的优化方法。
考虑慢磁盘、网络延迟、内存不足和服务器负载对性能的影响。