Postgresql

索引可以通過多種方式過濾的表列的正確方法

  • August 6, 2017

我有一個評論表,其中包含常用欄位,即作者、標題、正文、created_at 等。還有一個名為“user_id”的欄位,它儲存評論所針對的使用者的 id。

在前端,我創建了一個過濾器 UI,它基本上允許使用者根據日期、使用者是否回複評論、全文正文搜尋、類別等過濾評論。所有這些過濾器都是可選的,可以組合起來創建一個相當大的查詢。它基本上看起來像這樣:

SELECT * FROM comments WHERE user_id = ? AND .... AND ...

我的第一種方法是索引 user_id,然後將其保留。但是,在閱讀了更多關於它的資訊後,我不確定這是最好的方法。另一方面,為每一列創建一個“可過濾”的索引似乎也不是一個好主意。

有什麼建議?

編輯:Postgres 文件似乎回答了我的問題https://www.postgresql.org/docs/9.6/static/indexes-bitmap-scans.html

每個索引都會增加一些價值,並且是有代價的。由您決定價值是否超過成本。

為了處理該值,您必須找出哪些查詢使用索引,以及在沒有索引的情況下這些查詢執行的速度有多慢。

為了掌握成本,您必須找出在底層表上執行的更新速度有多慢,以及索引本身佔用了多少空間。

有一些工具可以幫助您評估這些事實。事實是客觀的。你給他們的價值不是。您對查詢速度的重視程度以及為更新減慢分配的成本取決於您要實現的目標以及您的相對優先級。這取決於你。

引用自:https://dba.stackexchange.com/questions/182663