针对 20 多个列的不同搜索的最佳索引策略指南

Nie*_*ian 5 postgresql performance index index-tuning

我正在运行一个汽车搜索引擎。它由 postgresql 9.3 安装支持。

现在我不确定对前端搜索进行索引优化的最佳方法/策略。

问题:

包含汽车的表包含大约 150 万行。搜索汽车的人需要不同的搜索条件。有的按品牌/型号搜索,有的按年份搜索,有的按里程搜索,有的按价格搜索,有的按特殊设备搜索,等等 - 通常他们将一大堆标准结合在一起。当然,有些,如品牌/模式和价格,比其他的使用频率更高。我们总共提供:9 个类别标准,如品牌/型号或车身类型,加上 5 个数字标准,如价格或里程数,以及 12 个布尔标准,如设备。最后,人们可以按不同的列(年份、价格、里程和我们为汽车创建的分数)对结果进行排序。默认情况下,我们按照自己生成的分数进行排序。

到目前为止我所做的:

我已经“轻松”分析了标准的使用,并创建了一些索引(10)。其中包括例如价格、里​​程和品牌/型号的组合指数。由于我们只对显示实际待售汽车的结果感兴趣,因此将索引作为销售状态列上的部分索引。

问题:

  1. 您将如何分析和确定应该对哪些列编制索引,以及如何编制?
  2. 为 20 多个列上发生的搜索优化索引时,最佳策略是什么,其中使用和组合变化很大?(只对所有内容进行索引,对某些列进行索引,进行组合索引,仅进行单列索引等)
  3. 我希望索引所有列没有意义?
  4. 我希望索引布尔列没有意义?
  5. 是否对 5 个常用列进行组合索引而不是对每个列进行单独索引更好?
  6. 按我的默认排序对所有索引进行排序是个好主意吗?
  7. 您是否有使用其他可以大大提高性能的方法(例如,强制索引保留在内存中等)的经验?

Ric*_*mes -1

  1. 捕获人们实际提出的查询。
  2. 分析#1 的数据;然后设计短的多列索引(每列 2 个,也许 3 个)
  3. 不,特别是对于是/否标志而言。可以将这些组合起来,如#2 所示。
  4. 参见#3。
  5. 列的顺序在索引中很重要。5 列索引(大致)相当于其第一列上的 1 列索引,但如果您不查询该列,则没有用处。
  6. 大概。
  7. 强制进入内存会适得其反,因为它会占用用于缓存其他内容的空间。

更多讨论: http://mysql.rjweb.org/doc.php/eav