唯一索引是否与基本索引具有相同的优势

时间:2014-03-01 20:09:17

标签: mysql sql laravel eloquent

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

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

这两个字段也恰好是唯一的,因此我需要一个唯一的约束索引。在laravel doc中,unique和index都在同一部分'index'下,所以我想知道它们在后台是否基本相同。一个唯一的索引会自动给我索引性能的好处吗?

如果我设置唯一约束索引

$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'));
});

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

首先,即使您正在使用“架构”构建器来创建迁移,这些问题仍然是基于mysqlsql的问题,所以我已将它们标记为这样,您可能会得到一些更有见地的答案。

关于你的问题:

1)否。如果您想在字段上设置单独的索引,您还需要单独编制索引。您所获得的组合唯一索引仅在与两个字段组合使用时才会发挥作用。

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