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