我在PostgreSQL数据库中有下表

ID | first_name | last_name    | class      | position |
--------------------------------------------------------
 1 | Teemo      | Shroomer     | Specialist | Top      |
 2 | Cecil      | Heimerdinger | Specialist | Mid      |
 3 | Annie      | Hastur       | Mage       | Mid      |
 4 | Fiora      | Laurent      | Slayer     | Top      |
 5 | Garen      | Crownguard   | Fighter    | Top      |
 6 | Malcolm    | Graves       | Specialist | ADC      |
 7 | Irelia     | Lito         | Figher     | Top      |
 8 | Janna      | Windforce    | Controller | Support  | 

并且在3个不同的存储过程中有3个WHERE子句.

WHERE first_name = 'Annie'
WHERE first_name = 'Annie' AND class = 'Mage'
WHERE first_name = 'Janna' AND class = 'Controller' AND position = 'Support'

我为我的表创建了索引,如下所示

CREATE INDEX first_name_index ON users (first_name);
CREATE INDEX first_name_class_index ON users (first_name, class);

我对创建的索引有几个问题.

  1. 因为我已经有了FIRST_NAME+CLASS复合索引.我真的只需要First_Name字段的单一索引吗?如果我理解正确的话,那么仅使用FIRST_NAME的搜索可以受益于复合索引‘FIRST_NAME_CLASS_INDEX’

  2. 如果我使用第三个WHERE子句(有3个字段),我使用‘FIRST_NAME_CLASS_INDEX’会得到什么好处吗?索引是否会首先在内部使用复合索引(FIRST_NAME+CLASS)执行搜索,然后从获得的列表中搜索‘Position’.对吗?

推荐答案

单列索引基本上毫无用处,您应该删除它.它不能做两列索引不能做的任何事情;它唯一的好处是它更小,所以PostgreSQL更喜欢用它来进行第一个查询.

两列索引也将有助于第三个查询.如果表中有足够的数据,PostgreSQL通常会使用索引扫描并添加第三个条件作为过滤器.

Database相关问答推荐

DynamoDB 扫描 - 具有相同分区键的项目按顺序返回

如何将初始数据放入数据库

如何在 N1QL 查询(Couchbase 查询)中使用 LENGTH() 字符串函数

如何以编程方式将产品添加到 Opencart 数据库

如何理解 CAP 定理的可用性?

如何使用错误消息中指定的 tbspaceid tableid 在 DB2 中查找表和列

如何将开发数据库更改移动到生产数据库?

在插入数据库之前而不是在输出时转义 HTML 是不是一个坏主意?

MySQL 中的多个 OR 子句

使用 Flask 时 Python 中持久数据库连接的最佳实践

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

使用存储过程是一种不好的做法吗?

将 Android Room 数据库与 Firebase 实时数据库相关联

Hibernate、spring、JPS 和隔离 - 不支持自定义隔离

Android 上的测试数据库:ProviderTestCase2 还是 RenamingDelegatingContext?

CouchDB、MongoDB 和 Redis 中的哪个数据库适合从 Node.js 开始?

Apache Spark 的主键

遍历数据库中的每条记录 - Ruby on Rails / ActiveRecord

数据库 EAV 优点/缺点和替代方案

如何从多个表中 Select 不同的值