创建数据库索引都有哪些最佳实践和“经验法则”?

     2023-02-23     23

关键词:

【中文标题】创建数据库索引都有哪些最佳实践和“经验法则”?【英文标题】:What are some best practices and "rules of thumb" for creating database indexes?创建数据库索引有哪些最佳实践和“经验法则”? 【发布时间】:2010-10-15 20:05:36 【问题描述】:

我有一个应用程序,它循环遍历数据库表中的大量记录,并对该数据库中的记录执行大量 SQL 和 .Net 操作(目前我在 PostgreSQL 上使用 Castle.ActiveRecord)。

我在几个字段上添加了一些基本的 btree 索引,正如您所料,SQL 操作的性能显着提高。想要充分利用 dbms 性能,我想对我应该在所有项目中索引的内容做出一些更明智的选择。

我知道在执行插入操作时会降低性能(因为数据库需要更新索引以及数据),但是在创建数据库索引时我应该考虑哪些建议和最佳实践?如何最好地为一组数据库索引选择字段/字段组合(经验法则)?

另外,我如何最好地选择将哪个索引用作聚集索引?当涉及到访问方法时,在什么情况下我应该使用 btree 而不是 hash 或 gist 或 gin(它们到底是什么?)。

【问题讨论】:

【参考方案1】:

我的一些经验法则:

索引所有主键(我认为大多数 RDBMS 在创建表时都会这样做)。 索引所有外键列。 仅在以下情况下创建更多索引: 查询速度很慢。 您知道数据量将显着增加。 在表格中填充大量数据时运行统计信息。

如果查询很慢,请查看执行计划并:

如果对表的查询只使用几列,将所有这些列放入索引中,那么您可以帮助 RDBMS 只使用索引。 不要浪费资源索引小表(数百条记录)。 按从高到低的顺序索引多个列。这意味着:首先索引具有更多不同值的列,然后是具有更少不同值的列。 如果查询需要访问超过 10% 的数据,则完全扫描通常比索引更好。

【讨论】:

这个答案是一个好的开始,但在某些方面有点简单。索引所有外键并不总是正确的,因为有时数据总是从 fk 遍历到 parent。如果从不询问,总是把最高基数放在第一位是没有用的。还有几件事。阅读this post 可能对某些读者有用。 @ErikE 我喜欢“查询基数上的索引,而不是大小基数”的一般过度简化——一般来说,查询的量级越高,对索引的要求就越高【参考方案2】:

这里有一个稍微简单的概述:由于索引的存在,数据修改确实存在开销,但您应该考虑对数据的读取和写入的相对数量。一般来说,读取次数远高于写入次数,在定义索引策略时应该考虑到这一点。

当谈到索引哪些列时,我一直认为设计人员应该对业务有足够的了解,以便能够很好地初步了解哪些列可能会受益。除此之外,它实际上归结为程序员的反馈、全面测试和系统监控(最好使用广泛的内部性能指标来捕获长时间运行的操作),

【讨论】:

【参考方案3】:

正如@David Aldridge 所提到的,大多数数据库执行的读取操作比写入操作多得多,此外,即使在执行 INSERTS(以确定插入的正确位置)时,通常也会使用适当的索引。

未知生产工作负载下的关键索引通常难以猜测/估计,不应将一组索引视为设置一次就忘记。应该随着工作负载的变化(例如新杀手报告)监控和更改索引。

没有什么比分析更重要了;如果您猜测您的索引,您通常会错过真正重要的索引。

作为一般规则,如果我不知道如何查询数据库,那么我将在所有外键上创建索引,在工作负载下配置文件(想想 UAT 版本)并删除那些未使用的,以及就像创建重要的缺失索引一样。

此外,请确保还创建了计划的索引维护计划。

【讨论】:

“计划的索引维护计划”是什么意思? @tuinstoel:不知道如何更准确地描述这一点。作为定期维护计划的一部分,所有生产数据库都应该重建碎片索引。 我认为这是特定于数据库供应商的。在 Oracle 世界中,重建 btree 索引被认为是一种不好的做法。 @tuinstoel:啊,好吧,我戴上了我的 sql server 帽子!

Coldfusion 中的多步骤表单都有哪些最佳实践?

】Coldfusion中的多步骤表单都有哪些最佳实践?【英文标题】:Whataresomebestpracticesformulti-stepformsinColdfusion?Coldfusion中的多步骤表单有哪些最佳实践?【发布时间】:2011-04-1223:55:54【问题描述】:我有一个三步表格,其中每个步骤都... 查看详情

创建数据模型的最佳实践 [关闭]

】创建数据模型的最佳实践[关闭]【英文标题】:Bestpracticesforcreatingadatamodel[closed]【发布时间】:2011-10-2900:57:11【问题描述】:对于当前项目,我正在创建一个数据模型。是否有任何来源可以找到良好数据模型的“最佳实践”?... 查看详情

Mysql 索引:查询生成器的最佳实践

...述】:我们有包含数百万数据的表格。我们打算在此表上创建索引以优化搜索。这里的问题是这个表上的11个过滤器是可变的,这意味着用户可以选择一个或多个过滤器。最后,where子句上的列可以在查询中按编号和顺序改变创... 查看详情

elasticsearch最佳实践

创建索引无mapping 创建索引名称为index的索引curl-XPUThttp://localhost:9200/book有mapping如果需要定义每个类型的结构映射,创建type名称为user和blogpost的mapping。curl-XPUT"http://localhost:9200/book"-d‘{"mappings":{"user":{"_all":{"enabled 查看详情

JQuery 命名空间的最佳实践 + 通用实用程序函数

...ctions【发布时间】:2011-05-3109:46:47【问题描述】:目前有哪些“经验法则”,用于实施JQuery命名空间以托管通用实用程序功能?我有许多分散在不同文件中的JavaScript实用程序方法,我想将它们整合到一个(或多个)命名空间中... 查看详情

多租户隔离数据库上 DAL 和配置的最佳实践

】多租户隔离数据库上DAL和配置的最佳实践【英文标题】:bestpracticeforDALandconfigurationonMulti-TenantisolatedDB【发布时间】:2012-12-2305:31:32【问题描述】:我的公司拥有十几个网站和独立的数据库(相同的模式)。每个客户都有自己... 查看详情

mysql索引都有哪些

...考技术A在满足语句需求的情况下,尽量少的访问资源是数据库设计的重要原则,这和执行的SQL有直接的关系,索引问题又是SQL问题中出现频率最高的,常见的索引问题包括:无索引(失效)、隐式转换。1.SQL执行流程看一个问题... 查看详情

索引最佳实践

...collation定义不当导致,因此我们在设计开发阶段,要避免数据库字段定义,避免出现隐式转换。由于MySQL不支持函数索引,在开发时要避免在查询条件加入函数,例如date(gmt_create)。所有上线的SQL都要经过严格的审核 查看详情

MySQL 索引 - 最佳实践是啥?

...时间】:2010-06-1521:39:07【问题描述】:我已经在我的MySQL数据库上使用索引有一段时间了,但从未正确了解它们。通常,我会使用WHERE子句在我将要搜索或选择的任何字段上放置一个索引,但有时它看起来并不那么黑白分明。MySQL... 查看详情

存储和索引 1M+ XML 文档的最佳实践?

】存储和索引1M+XML文档的最佳实践?【英文标题】:Bestpracticeforstoringandindexing1M+XMLdocuments?【发布时间】:2016-07-0318:06:31【问题描述】:我有一个存档了几年的XML文档。有100万多个独特的文档主题,每个主题在任何给定年份都可... 查看详情

经验法则和切比雪夫法则

经验法则和切比雪夫法则的判断是看一组数据是否对称,那我怎么判断数据是否对称呢?经验法则用于正态分布的数据,你所说的对称就是正态分布的意思。其实并不需要完全对称,你看图像大致差不多就行了。切比雪夫法则对... 查看详情

有哪些 C++ 标准库使用最佳实践? [关闭]

...要重新发明***,而是要依赖标准库。在C中,我经常最终创建一个链表,并且一遍又一遍地迭代链表(也许我做错了不确定),所以C++中可用的容器、字符串和算法 查看详情

使用 JWT 进行身份验证的最佳实践

...感到非常困惑,因为每个人对什么是使用它们的安全方式都有不同的看法。说安全是指处理注销和密码更改。还有,哪些数据不应该保存在JWT有效负载中。我的问题-使用JWT进行身份验证时是否 查看详情

Opensearch - 索引的最佳实践

】Opensearch-索引的最佳实践【英文标题】:Opensearch-bestpracticeforindexing【发布时间】:2022-01-2221:34:08【问题描述】:我有大约1TB的旧apache日志数据,我想在Opensearch中建立索引。日志是每天的,结构如下:s3://bucket/logdata/year/year_month... 查看详情

mysql都有哪些索引类型

...的就是B-Tree索引了。我们使用B-Tree这个词,是因为MySQL在创建表和其他语句中就使用这个关键字。然而,在不同存储引擎的底层可能使用不同的数据结构和算法,比如:InnoDB存储引擎内部使用的是B+Tree结构,NDB集群存储引擎内部... 查看详情

mysql存储引擎及索引类型都有哪些

...使用的2种存储引擎:1.Myisam是Mysql的默认存储引擎,当create创建新表时,未指定新表的存储引擎时,默认使用Myisam。每个MyISAM在磁盘上存储成三个文件。文件名都和表名相同,扩展名分别是.frm(存储表定义)、.MYD(MYData,存储数据... 查看详情

响应式和动态背景图像 - 最佳实践

...:2018-01-0318:01:03【问题描述】:很长一段时间,当我必须创建一个包含许多不同页面的网站(并且每个页面都有一个带有不同背景图片的英雄部分)时,我曾经这样做:<divclass="hero"style="background-image:url(my-dynam 查看详情

grails 索引页面的最佳实践

】grails索引页面的最佳实践【英文标题】:Bestpracticesforgrailsindexpage【发布时间】:2010-09-1623:16:21【问题描述】:在grails应用程序中为索引页面填充模型的正确方法是什么?默认情况下没有IndexController,是否有其他机制可以将这... 查看详情