我在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在一个查询中添加/删除多个索引?如果没有,我可能只需要运行一个“原始”查询。
谢谢你的时间!
2条答案
按热度按时间cczfrluj1#
可以将列数组传递给
index()
方法h6my8fg22#
我不相信有办法。laravel的模式函数对于不同数据库格式的兼容性很有用,但可能不是最有效的。只需为生产服务器编写可比较的原始sql: