Есть ли способ в Laravel добавить / удалить несколько индексов одним запросом? - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть немного кода в миграции 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 голосов
/ 05 сентября 2018

Я не верю, что есть способ.Функции схемы Laravel полезны для совместимости с различными форматами базы данных, но могут быть не самыми эффективными.Просто напишите сопоставимый raw 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');
    });
}
0 голосов
/ 05 сентября 2018

Вы можете передать массив столбцов в index() метод

Schema::table('users', function (Blueprint $table) {
    $table->index(['column1', 'column2', 'column3']);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...