我正在构建我的迁移,并希望两个字段具有性能原因的索引,因为在这些字段上执行了多个连接。
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'));
});
答案 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)
首先,即使您正在使用“架构”构建器来创建迁移,这些问题仍然是基于mysql
和sql
的问题,所以我已将它们标记为这样,您可能会得到一些更有见地的答案。
关于你的问题:
1)否。如果您想在字段上设置单独的索引,您还需要单独编制索引。您所获得的组合唯一索引仅在与两个字段组合使用时才会发挥作用。
2)如果您不想索引,则不必使用InnoDB。 MyISAM仍然支持indexxes和uniques。