在laravel中有没有一种方法可以用一个查询添加/删除多个索引?

5m1hhzi4  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(283)

我在laravel迁移(mysql数据库)中有一段代码,如下所示:

Schema::table('users', function (Blueprint $table) {
    $table->index('column1');
    $table->index('column2');
    $table->index('column3');
});

运行此迁移的最终结果很好。问题是它非常慢,因为当我看mysql的 SHOW PROCESSLIST ,laravel正在这样做:

ALTER TABLE `users` ADD INDEX `column1_index` (`column1`);
ALTER TABLE `users` ADD INDEX `column2_index` (`column2`);
ALTER TABLE `users` ADD INDEX `column3_index` (`column3`);

我对使用这种查询样式将索引添加到表中的速度优势感兴趣:

ALTER TABLE `users`
    ADD INDEX `column1_index` (`column1`),
    ADD INDEX `column2_index` (`column2`),
    ADD INDEX `column3_index` (`column3`);

如果我手动运行后者,它大约比运行前者快3倍。对于在生产环境中运行这些查询,这是非常有价值的。
edit:为了澄清,我并没有为这三列寻找复合键。我不是在找 $table->index(['column1', 'column2', 'column3']); 我正在寻找一个与我已经拥有的代码在功能上相同的结果,但是将三个查询组合成一个查询的速度优势。
有没有办法让laravel在一个查询中添加/删除多个索引?如果没有,我可能只需要运行一个“原始”查询。
谢谢你的时间!

cczfrluj

cczfrluj1#

可以将列数组传递给 index() 方法

Schema::table('users', function (Blueprint $table) {
    $table->index(['column1', 'column2', 'column3']);
});
h6my8fg2

h6my8fg22#

我不相信有办法。laravel的模式函数对于不同数据库格式的兼容性很有用,但可能不是最有效的。只需为生产服务器编写可比较的原始sql:

if (config('app.env') === 'production') {
    DB::statement('ALTER TABLE `users`
    ADD INDEX `column1_index` (`column1`),
    ADD INDEX `column2_index` (`column2`),
    ADD INDEX `column3_index` (`column3`);');
}
else {
    Schema::table('users', function (Blueprint $table) {
        $table->index('column1');
        $table->index('column2');
        $table->index('column3');
    });
}

相关问题