【问题标题】:does a unique index give the same benefit as a basic index唯一索引是否提供与基本索引相同的好处
【发布时间】:2014-04-02 21:42:24
【问题描述】:

我正在构建我的迁移,并且出于性能原因希望两个字段具有索引,因为在这些字段上执行了多个联接。

http://laravel.com/docs/schema#adding-indexes

这两个字段也恰好是唯一的,所以我需要一个唯一的约束索引。在 laravel 文档中,唯一性和索引都在同一部分“索引”下,所以我想知道它们在后台是否基本相同。唯一索引会自动给我带来索引性能优势吗?

如果我设置一个唯一约束索引

$table->unique(array('object_type', 'object_id')); 

问题 1) 这将实现与基本索引

相同的好处
$table->index('object_type');
$table->index('object_id');

问题2:设置这些类型的索引时,是否需要将引擎类型设置为InnoDB?

Schema::create('my_table', function (Blueprint $table) {
  $table->increments('id');

  $table->string('object_type');
  $table->unsignedInteger('object_id');

  $table->engine = 'InnoDB';
  $table->unique(array('object_type', 'object_id'));
});

【问题讨论】:

    标签: mysql sql laravel eloquent


    【解决方案1】:

    首先,即使您使用 Schema 构建器来创建迁移,这些问题也更多基于 mysqlsql,因此我已将它们标记为此类,您可能会得到一些更有见地的答案。

    关于您的问题:

    1) 不可以。如果您想在字段上建立单独的索引,您还需要单独为它们建立索引。您获得的组合唯一索引只有在与两个字段结合使用时才会发挥作用。

    2) 如果您不想使用索引,则不必使用 InnoDB。 MyISAM 仍然支持 indexxes 和 uniques。

    【讨论】:

      【解决方案2】:

      索引对特定查询的性能优势取决于搜索参数(也称为 where 子句)。

      将 object_type 和 object_id 放在一起(并按此顺序)的单个索引将有助于指定 object_type 的查询;或 where 子句中的 object_type 和 object_id。如果不提供 object_type 将无济于事。

      两个索引 - 一个在 object_type 上,另一个在 object_id 上,将根据 where 子句中相应列的存在分别提供帮助。如果 where 子句同时指定 object_type 和 object_id,则值的特异性将决定为您的查询选择两个索引中的哪一个。

      【讨论】:

        猜你喜欢
        • 2012-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-27
        • 2017-04-06
        • 2012-03-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多