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

我在两个FIED上添加了一些基本的btree索引,正如您所预期的那样,SQL操作的性能大大提高了.为了最大限度地利用DBMS性能,我想做出一些受过更好教育的 Select ,即我应该为我的所有项目编制索引.

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

另外,如何最好地 Select 要用作聚集索引的索引?说到访问方法,在什么条件下,我应该在散列、要点或杜松子wine 上使用btree(它们到底是什么?).

推荐答案

我的一些经验法则:

  • 索引所有主键(我认为大多数RDBMS在创建表时都会这样做).
  • 为所有外键列编制索引.
  • 仅在以下情况下创建更多索引:
  • 在表中填充大量数据时运行统计数据.

如果查询速度较慢,请查看执行计划并执行以下操作:

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

Database相关问答推荐

为Postgres数据库字段创建复合索引

SearchView 在 Android Studio 中显示 Data.entity.Cantact.@85c7ce6

为什么引用 SQLite rowid 会导致外键不匹配?

如何以编程方式在 C# 中创建 Microsoft Access 数据库?

我应该为 Realm 中的每个实体定义主键吗?

MySQL 慢查询日志(log) - 慢有多慢?

docker-compose mysql init sql 未执行

使用 ContentValues 和更新方法更新 sql 数据库

如何在 Play 2.0 中 for each 环境设置不同的数据库?

应用程序服务器 JDBC 资源的 DataSource 或 ConnectionPoolDataSource

设计数据库时最重要的考虑因素是什么?

自动增量唯一标识符

在 MySQL 存储过程中使用if和else

MySQL:LAST_INSERT_ID() 返回 0

在将字符串插入数据库期间单引号转义

MySQL 整数 0 与 NULL

如何对彼此接近的纬度/经度点进行分组?

与内连接相反

我将如何为读写操作实现单独的数据库?

以编程方式嵌入 Java h2 数据库