database - 创建数据库索引有哪些最佳实践和 "rules of thumb"?

标签 database database-design indexing

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

我在几个字段上添加了一些基本的 btree 索引,正如您所期望的那样,SQL 操作的性能显着提高。想要充分利用 dbms 的性能,我想就我应该为我的所有项目建立索引的内容做出一些更有根据的选择。

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

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

最佳答案

我的一些经验法则:

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

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

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

关于database - 创建数据库索引有哪些最佳实践和 "rules of thumb"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/687986/

相关文章:

performance - 如何加速 OpenGrok 索引

java - 将代号放在一个 Tab selectedIndex 的第一个位置

Mysql:2个ID的主键内部连接给出 "Range checked for each record"

php - 为什么我的 Laravel 模块出现 "class not found"错误?

php - 数据库连接功能

ios如何用iphone应用程序版本按版本管理数据库?

mysql - 需要有关挂起大型 MySQL 事务的帮助

java - 用于为 Java 定义关系数据库结构的图形实用程序

java - 从 postgresql 填充 jTable

php - 如何在 MySQL 表中存储故事?