LARAVEL + UUID КАК БЫСТРО РАБОТАЕТ? ТЕСТИРУЮ UUID В КАЧЕСТВЕ PRIMARY KEY В MARIADB
Автор:
Eugeny Nosenko
Дата публикации:
2023-01-14 15:46:10 1465
Всем привет!
Меня давно интересовало как быстро работает 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();
Такими оказались результаты моего эксперимента
Всем счастливой разработки </>