在WHERE子句中包含大量列的查询的索引

Fre*_*xuz 8 postgresql indexing

为公寓网站建立搜索引擎,我不知道如何索引apartments表格.

查询示例:

  • ...WHERE city_id = 1 AND size > 500 AND rooms = 2
  • ...WHERE area_id = 2 AND ad_type = 'agent' AND price BETWEEN 10000 AND 14000
  • ...WHERE area_id = 2 OR area_id = 4 AND published_at > '2016-01-01' AND ad_type = 1

如您所见,列可能会有很大差异,WHERE子句中的列数最多可为10,甚至可能更多.

  • 我应该索引所有这些吗?
  • 只有最常见的?

Lau*_*lbe 7

您必须弄清楚WHERE您将在此查询中使用哪些子句,每种情况发生的频率以及每种条件的选择性.

  • 除非必须,否则不要为很少发生的查询编制索引.

  • 使用多列索引,从=比较中将出现的列开始.

  • 关于多列索引中列的顺序,从自己将在查询中使用的那些列开始(索引可以用于仅包含其某些列的查询,前提是它们位于索引的开头).

  • 您可能会忽略具有低选择性的列,例如gender.

例如,使用上面的查询,如果它们都是频繁的并且所有列都是选择性的,那么这些索引就会很好:

... ON apartments (city_id, rooms, size)

... ON apartments (area_id, ad_type, price)

... ON apartments (area_id, ad_type, published_at)
Run Code Online (Sandbox Code Playgroud)

这些索引也可以用于WHERE仅包含area_id或包含city_id在其中的子句.

索引太多是不好的.

如果上述方法会导致索引太多,例如因为用户可以为WHERE子句选择任意列,则最好对各个列进行索引,或者偶尔对经常组合在一起的列进行索引.

这样PostgreSQL可以选择一个位图索引扫描来组合一个查询的多个索引.这比常规索引扫描效率低,但通常比顺序扫描更好.