【问题标题】:Should I create index on created_at column on database [closed]我应该在数据库的 created_at 列上创建索引吗[关闭]
【发布时间】:2021-07-27 06:29:52
【问题描述】:

也许这是一个愚蠢的问题,但在我的数据库架构中,我正在基于对简单帖子表的分析按时间进行工作。 在 postgresql 上的 created_at 列上创建索引或已经在执行 created_at 索引的数据库上创建索引是个好主意吗?

在我的帖子表中

| post_id | user_id| some_post_stuff... | created_at |  
|:--------:|:--------------:|:--------:|:--------------:|  
| 1| 1 | hello #world | 05/05/2021 |  
| 2| 1| #stackoverflow is best | 05/05/2021 |  

在我的标签表中

| tag_id | tag | trended_at |  
|:--------:|:--------------:|:--------:|  
| 1 | world | 05/05/2021 |  
| 2 | stackoverflow | 05/05/2021 |  

在我的 post_tags 表中

| tag_id| post_id| created_at |  
|:--------:|:--------------:|:--------:|  
| 1| 1| 05/05/2021 |  
| 2| 2| 05/05/2021 |  

我编写了一个函数来查找带有最流行标签的趋势帖子。所以每15分钟一次。数据库 cron 作业(nodejs 客户端)功能在 post_tags 上按命令执行组,然后找到趋势标签,然后选择帖子。我是否应该在 post_tags.created_at 上创建 created_at 索引,因为当我插入此表时,它会更新主键索引文件,但 created_at 对于这种情况很重要? 感谢您的帮助。

【问题讨论】:

  • Edit 问题并包含表的CREATE 语句以及您要支持的一个或多个查询。
  • created_attrended_at是什么类型?
  • 该表的 SELECT、UPDATE 和/或 DELETE 语句在哪里?以及这些语句的 EXPLAIN (ANALYZE, BUFFERS, VERBOSE) 的结果。在不知道您的查询和查询计划的情况下,我们只能猜测。
  • 只有在您知道查询、需要它们的频率以及它们必须有多快,并且如果您知道表数据的修改频率和速度有多快的情况下,您才能决定是否建立索引必须是。

标签: database postgresql indexing


【解决方案1】:

Postgres 不会为您创建索引(主键除外)。如果要索引某些内容,则需要自己添加。

你应该索引一列吗?取决于你如何查询。索引对于搜索和排序都很有用。如果没有索引,数据库可能不得不搜索整个表或花费大量时间对结果进行排序。

如果您的查询必须搜索大量行并使用order by created_at 对它们进行排序,或者在where created_at between '2015-01-01' and '2015-12-31 23:59:59' 等 where 子句中使用 created_at,您应该索引 created_at。

如果您的查询返回少量行,您可能不必为 created_at 编制索引。例如:select * from posts where user_id = X order by created_at 可能会使用 user_id 上的索引将行过滤到一个小集合。通过 created_at 对它们进行排序会很快,因此不需要索引。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-24
    • 2018-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-29
    相关资源
    最近更新 更多