Laravel中有没有一种方法可以通过单个查询添加/删除多个索引?

时间:2018-09-05 17:33:24

标签: php mysql laravel laravel-5

我在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倍。对于在生产环境上运行这些查询,这非常有价值。

编辑:为澄清起见,我不是在寻找这三列的组合键。我不是在寻找$table->index(['column1', 'column2', 'column3']);,而是在寻找已经存在的代码的功能相同的结果,但是将三个查询合并为一个的速度优势。

有没有办法让Laravel在单个查询中添加/删除多个索引?如果没有,我可能只需要运行“原始”查询。

谢谢您的时间!

2 个答案:

答案 0 :(得分:1)

我不相信有办法。 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');
    });
}

答案 1 :(得分:-1)

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

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