我在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在单个查询中添加/删除多个索引?如果没有,我可能只需要运行“原始”查询。
谢谢您的时间!
答案 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']);
});