【问题标题】:Laravel Decimal Column IndexingLaravel 十进制列索引
【发布时间】:2017-12-16 14:34:16
【问题描述】:

我在我的表“帖子”上使用众所周知的 reddit 'hot' 算法。现在这个热列是一个十进制数,像这样:'XXXXX,XXXXXXXX'

我希望此列成为索引,因为当我按“热”排序时,我希望查询尽可能快。但是,我对索引有点陌生。索引是否需要唯一?

如果它必须是独一无二的,这会有效吗?

$table->unique('id', 'hot');

如果它不必是唯一的,这是否是正确的方法?

$table->index('hot');

最后一个问题:以下查询是否会利用索引?

 Post::orderBy('hot', 'desc')->get()

如果没有,我应该如何修改?

非常感谢!

【问题讨论】:

  • 不是 100% 确定,但几乎 100% 确定所有 3 个问题的答案都是肯定的。 (虽然我认为 unique 只需要 1 个参数)。执行EXPLAIN SELECT * FROM posts ORDER BY hot DESC 可以验证您的索引是否正在使用(但应该是)。
  • 等等。所以目前,我正在做 $table->index('hot'),因为该列不是唯一的。使用说明查询,不幸的是它没有使用任何键。

标签: php mysql laravel indexing database-indexes


【解决方案1】:

除非您需要不能插入重复项的约束,否则不要将其设为唯一。

换个说法,UNIQUE 键有两种含义:INDEX(用于快速搜索)和“约束”(在尝试插入 dup 时出错)。

ORDER BY hot DESC 可以使用INDEX(hot)(或UNIQUE(hot))。我说“可以”,而不是“将”,因为优化器可能会决定不使用索引的其他问题。 (没有看到实际的查询和对数据集的更多了解,我不能更具体。)

如果idPRIMARY KEY,那么这些都没有任何用处:INDEX(id, hot); UNIQUE(id, hot)。交换列的顺序是有意义的。或者干脆INDEX(hot)

警告:EXPLAIN 没有说明索引是否用于ORDER BY,仅用于WHERE。另一方面,EXPLAIN FORMAT=JSON 确实提供了更多细节。试试看。

(是的,DECIMAL 列可以被索引。)

【讨论】:

  • 感谢您提供的所有信息!但我很确定“解释”确实显示是否使用索引?如果我强迫它使用它,它会显示它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-26
  • 1970-01-01
  • 1970-01-01
  • 2015-03-11
  • 2014-05-08
相关资源
最近更新 更多