Как правильно добавить индекс в столбцы базы данных 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