Laravel и MySQL понимание индекса и составного / составного индекса - PullRequest
0 голосов
/ 20 февраля 2020

В Laravel (v 6.8) я создал ниже миграцию для таблицы users.

Миграция пользователя

public function up()
{
    Schema::create('users', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('username')->unique()->index();
        $table->string('email')->unique()->index();
        $table->timestamp('email_verified_at')->nullable();
        $table->string('password')->nullable();
        $table->enum('role', ['super', 'admin', 'manager', 'subscriber', 'user'])->default('user');
        $table->boolean('is_root')->default(FALSE);
        $table->rememberToken();
        $table->timestamps();

        $table->unique(['username', 'email'], 'user_unique_credentials');
        $table->index(['username', 'email'], 'user_index_columns');
    });
}

Объяснение

Я знаю основы index и как это работает, но у меня не очень ясное понимание о index на отдельных column и composite/compound index.

Приложение может иметь запрос только по username или email, или у меня может быть запрос для обеих таблиц вместе. Поэтому, как вы можете видеть в моем коде миграции, я установил index для каждого столбца, а также для обоих столбцов, используя $this->index(), который создает compound index.

Вопрос

Я хочу знать, правильно ли я установил все indexes или это плохая идея, чтобы настроить, как я сделал?

Если это не правильно, то могу ли я знать, как это сделать?

1 Ответ

1 голос
/ 20 февраля 2020

@ danblack спасибо за вашу помощь.

Хорошо, так что, попробовав запрос EXPLAIN с различными способами настройки unique и index, наконец, я нашел окончательную версию как ниже.

public function up()
{
    Schema::create(
        'users',
        function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('username')->unique();
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password')->nullable();
            $table->enum('role', ['super', 'admin', 'manager', 'subscriber', 'user'])->default('user');
            $table->boolean('is_root')->default(FALSE);
            $table->rememberToken();
            $table->timestamps();

            $table->unique(['username', 'email'], 'users_unique_credentials');
        }
    );
}

Таким образом, когда мы запрашиваем отдельный столбец, он использует собственный уникальный индекс. Когда мы ищем по обоим столбцам с несколькими предложениями WHERE, он будет использовать индекс compound unique.

...