【问题标题】:Laravel quick integer lookup?Laravel 快速整数查找?
【发布时间】:2019-11-26 11:27:10
【问题描述】:

我们有一个包含数百万行的表。最近我们引入了一个整数作为辅助键,它只是一个唯一的整数列new_identifier = 1100327,还没有定义为辅助主键。

这个查找查询在 tinker 中大约需要 6 秒。 $this->id_lookup 也是一个整数。最长可达 50 秒!

DB::table('my_big_table')->where('new_identifier', $this->id_lookup)->get();

我们如何才能达到与DB::table('my_big_table')->find($this->id_lookup); 几乎即时的相同性能?

我们能否引入第二个主键,例如 $table->key(['id', 'new_identifier']);

这将如何影响在其他地方执行的其他查找(例如 MyBigTable::find($id);)?

更新 - 将列从 int 更改为 index 将查找时间从 50 秒减少到

【问题讨论】:

  • 可能是分区。
  • 这就是我们的想法。我们有第二张表,记录数相同,通过 32 个字符散列搜索几乎是即时的。

标签: php mysql laravel eloquent


【解决方案1】:

您可以创建索引,在迁移中执行以下操作。

Schema::table('my_big_table', function (Blueprint $table) {
    $table->index('new_identifier');
});

索引可以帮助你,但主键索引是特殊的,它们是聚集的。这意味着它包含以下键的所有数据。虽然二级索引是非聚集的,但只会包含索引列和主键列。它仍然会提高性能,但在这个领域您需要大量研究不同索引对查询的影响,而且并非非黑即白。

【讨论】:

  • 这可能是另一个问题,但unique 索引的性能是否比index 更好?
  • 当我阅读您关于二级索引的声明时,您需要重新阅读manual -> " 除聚集索引之外的所有索引都称为二级索引。在 InnoDB 中,每条记录在二级索引中包含行的主键列,以及为二级索引指定的列。InnoDB 使用这个主键值来搜索聚集索引中的行。如果主键很长,则二级索引使用更多的空间,所以有一个短的主键是有利的。"
  • index 代表bigInt?
  • @Raymond Nijland 从我的学校课本中脱颖而出 :) 但感谢更新了措辞。
  • is index 查询也使用 `->where('new_id, $newId);` 完成?
猜你喜欢
  • 1970-01-01
  • 2014-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-23
相关资源
最近更新 更多