Как правильно добавить индекс в столбцы базы данных mysql?

Я пытаюсь освоить индексные столбцы в базе данных. Но, по-моему, у меня ничего не работает.

Создаю таблицу специально для теста:

public function up()
    {
        Schema::create('products', function (Blueprint $table) {
            $table->id();
            $table->string('name', 50);
            $table->string('color')->index();
            $table->string('gender');
            $table->unsignedBigInteger('old_price')->index();
            $table->unsignedBigInteger('price');

            $table->timestamps();
        });
    }

Создаю таблицу специально для теста:

public function definition()
    {
        return [
            'name' => $this->faker->text(50),
            'color' => $this->faker->randomElement(['white', 'black']),
            'gender' => $this->faker->randomElement(['man', 'woman', 'boy']),
            'old_price' => $this->faker->numberBetween(11,14),
            'price' => $this->faker->numberBetween(15,18),
            ];
    }

Запускаю Seeder:

public function run()
    {
        Product::factory(500000)->create();
    }

После этого я поочередно пытаюсь найти какие-то результаты. Но разницы во времени не замечаю. Столбцы, находящиеся в индексе, загружаются так же, как и без индекса.

$products = Produst::select()
            ->where('color', 'white')
            //->where('gender', 'woman')
            //->where('price', '15')
            //->where('old_price', '18')
            ->get();
        dump($products );
        $loadingTime = round(microtime(true) - LARAVEL_START, 3);
        echo $loadingTime ;
        dd();

Эти данные загружаются примерно за 8 секунд. Что я делаю не так? Какие? Я не понимаю? Заранее спасибо!

P.S. Пишу на Laravel, если кому-то незнакома часть кода. Но, я думаю, принцип понятен.


Ответы (1 шт):

Автор решения: Владимир Клыков

Для начала измерять только время того кода который вы хотите измерить:

$time_start = microtime(true);
$products = Produst::select()
            ->where('color', 'white')
            //->where('gender', 'woman')
            //->where('price', '15')
            //->where('old_price', '18')
            ->get();
        $loadingTime = round(microtime(true) - $time_start  , 3); // not LARAVEL_START
        dump($products ); //опять лишнее время на вывод в консоль, делаем после замера времени
        // и если данных выводить много - это время легко может превысить и время самого запроса 
        // и время на получение данных, которое этот пример тоже не учитывает.

а вот по этой ссылке вы можете посмотреть несколько понастоящему верных примеров: https://stackoverflow.com/questions/41745339/test-query-execution-time-in-laravel

например вот: https://stackoverflow.com/a/48938845/10387878

→ Ссылка