Database design 是否有创建适当数据库索引的策略?
有人问了这个问题:“我开始思考我设计的所有数据库模式和我读过的书,没有一本参考书给出了任何关于创建索引的明确建议 比如,;如果你有一个复合索引,比如Database design 是否有创建适当数据库索引的策略?,database-design,indexing,schema,Database Design,Indexing,Schema,有人问了这个问题:“我开始思考我设计的所有数据库模式和我读过的书,没有一本参考书给出了任何关于创建索引的明确建议 比如,;如果你有一个复合索引,比如 date() ++ foo() ++ bar() 虽然此索引非常适合搜索和排序日期范围数据(读取;读取性能)。。。这对作家来说是可怕的。(插入总是发生在平衡树的右侧,迫使重新平衡,这是一项昂贵的操作) 显然。。。a) 了解你的数据。b) 了解您的用例。c) 了解你的数据库引擎 但是,为高性能数据库定义合理模式的一般常识规则是什么?创建索引的经验法
date() ++ foo() ++ bar()
虽然此索引非常适合搜索和排序日期范围数据(读取;读取性能)。。。这对作家来说是可怕的。(插入总是发生在平衡树的右侧,迫使重新平衡,这是一项昂贵的操作)
显然。。。a) 了解你的数据。b) 了解您的用例。c) 了解你的数据库引擎
但是,为高性能数据库定义合理模式的一般常识规则是什么?创建索引的经验法则只有几条:
- 在外键上创建索引
- 在典型的搜索列上创建索引,如用户的登录名和pin、产品的产品id等
- 不要创建任何,因为您认为它可以提高性能
- 观察您的应用程序并识别耗时的查询
- 确定关键查询后,分析执行计划并使用索引对其进行优化
在最后一句话中,你说“定义一个合理的模式”。这比如何设计索引要普遍得多。好的,这里有一些关于索引生成的非常明确的建议:这取决于具体情况 这很清楚,但一点也不具体。如果你想要更具体的东西,你必须了解它取决于什么 这取决于您的DBMS,甚至可能取决于您的DBMS的版本。以下是一些你应该了解的流行语,至少在表面上是这样。我所说的“表面上”是指了解它为你做了什么,它会如何伤害你,但不一定知道它是如何工作的。如果可以,请使用特定于DBMS的文档 避免全表扫描 仅索引检索 范围检索。(和复合或复合指数) 合并联接(稍后讨论) 散列索引 并发控制(稍后讨论) 主键和索引(稍后讨论) 索引更新的成本 索引的延迟更新 基于成本的优化。如果您的DBMS没有CBO,那么请使用另一个DBMS 提示。(如何使用它们,以及如何在没有它们的情况下生活。) 数据库管理和CBO。有些DBMS需要定期执行DBA操作,以防止优化器使用过时的策略 这取决于容量:对于非常小的表,索引设计相对来说是微不足道的。所谓“相对琐碎”,我的意思是它相当容易,但也相当不重要。犯错的代价很低。如果您正在构建查找表,那么您肯定希望代码列上有一个唯一的索引。如果将代码列声明为主键,则会得到这样一个表(对于大多数DBMS)。如果不创建任何其他索引,那么成本很可能是在可以容忍延迟的异常情况下扫描一个小表 任何模式中的大型表往往是通过常规事务处理添加到的表。在速度和事务并发性方面,这增加了使用某些索引的好处。它还增加了拥有索引的成本,因为事务必须更新索引。成本效益权衡对于事务表来说非常微妙和重要 如果您的DBMS支持延迟更新,那么您可以在事务表上使用一些索引来获得良好的效果 在任何模式中,至少要尝试区分引用表和事务表。我知道,我知道,这有点主观。运用你最好的判断 这取决于流量:并非所有表都获得相同的流量。索引可以加速连接和查找。至少,您应该了解DBMS是否有优化器,它知道如何基于可用索引和表卷进行合并联接。 如果您不知道什么是合并联接,请了解它是什么。但是不要浪费时间学习如何编写合并连接,除非这是你谋生的方式 这取决于紧迫性。在批处理过程中,每月执行一次的查询并不像一个用户盯着屏幕或在上下文切换她的多任务处理时,每天占用用户1000次的查询那么紧急 当心产品营销会告诉你什么是紧急情况。他们往往会告诉你,在任何情况下,比竞争对手更快都是最紧迫的任务,即使这意味着在晚上和周末工作,而你却错过了第一个孩子的出生。市场营销通常不在乎你是否精疲力竭。他们就像一个骑师,不在乎马是否再次比赛。事实是,有些交易非常紧急,而另一些则相对不重要 <> P>准备好对指标设计灵活,并考虑权衡。
我希望我能给你指一本关于这个问题的好书。我希望其他人也会这样做。关于这个主题有什么好的文档吗??