LARAVEL + UUID КАК БЫСТРО РАБОТАЕТ? ТЕСТИРУЮ UUID В КАЧЕСТВЕ PRIMARY KEY В MARIADB

Автор: Eugeny Nosenko
Дата публикации: 2023-01-14 15:46:10   1465


LARAVEL + UUID КАК БЫСТРО РАБОТАЕТ? ТЕСТИРУЮ UUID В КАЧЕСТВЕ PRIMARY KEY В MARIADB

Всем привет!

Меня давно интересовало как быстро работает UUID. Несколько раз у меня были дискуссии по этому вопросу с другими разработчиками. И вот я решил проверить все сам практике.

Что быстрее в качестве первичного ключа UUID или Unsigned biginteger? 

Тип данных UUID предназначен для хранения 128-битных данных UUID (Universally Unique Identifier)
UUID хранятся в удобном для индекса виде, порядок UUID llllllll-mmmm-Vhhh-vsss-nnnnnnnnnnnn сохраняется как: nnnnnnnnnnnn-vsss-Vhhh-mmmm-llllllll
Основное назначение UUID — обеспечение уникальности данных в больших распределенных системах.

Так как я Laravel разработчик то и проверять все решил в привычной для себя среде.

PHP 8.1
MariaDB 10.7.7
Laravel 9

Быстро добавил миграции и сиды.

Получилось 4 таблицы. Ссылка на код

При этом Laravel столбец uuid создал как char(36).

В миграции это поле описано так $table->uuid('id')->primary();

test_ids
test_uuids
test_id_relations
test_uuid_relations

Модель пришлось немного подправить.

<?php
	

	namespace App\Models;
	

	use Illuminate\Database\Eloquent\Factories\HasFactory;
	use Illuminate\Database\Eloquent\Model;
	use Illuminate\Database\Eloquent\Relations\HasMany;
	use Illuminate\Support\Str;
	

	/**
	 * @property string $id
	 */
	class TestUuid extends Model
	{
	    use HasFactory;
	

	    protected $keyType = 'string';
	

	    public $incrementing = false;
	

	    protected $casts = [
	        'id' => 'string'
	    ];
	

	    protected $fillable = [
	        'name',
	        'city'
	    ];
	
        //Основное здесь 
  	    protected static function boot()
  	    {
  	        parent::boot();
  	        static::creating(fn(self $testUuid) => $testUuid->id = Str::uuid()->toString());
  	    }
  	}

После подготовки я начал тесты.

Вставка через сиды 10000 записей для unsigned biginteger оказалась на пару секунд быстрее.

Размеры таблиц значительно различались. Так как uuid это char(36), то и занимает места больше.

Выборка 1000 записей без условий



Разница почти в два раза в пользу unsigned biginteger.

Выборка с условиями

SELECT * FROM test_id_relations WHERE test_id_id in (SELECT id FROM test_ids)

SELECT * FROM test_uuid_relations WHERE test_uuid_id in (SELECT id FROM test_uuids)

Разница так же почти в два раза быстрее, где первичный ключ целое число.

Таким образом можно сделать вывод, что размер таблиц увеличивается, а скорость выборки замедляется для таблиц где в качестве первичного ключа Laravel создал char(36) $table->uuid('id')->primary();

Такими оказались результаты моего эксперимента

Всем счастливой разработки </>



Оставить комментарий:
Имя:
Комментарий: