За последние 24 часа нас посетили 22350 программистов и 1014 роботов. Сейчас ищут 679 программистов ...

А кто-нибудь пробовал UUID в качестве первичного индекса на высоконагруженных системах?

Тема в разделе "MySQL", создана пользователем Roman __construct, 26 сен 2019.

  1. Roman __construct

    Roman __construct Активный пользователь

    С нами с:
    27 апр 2019
    Сообщения:
    1.270
    Симпатии:
    112
    сабж)

    Собственно, два вопроса:

    1. Какой тип поля выбрать для UUID если я хочу использовать его в качестве primary?

    2. Стоит ли это вообще делать, если планируется 1m записей и больше?

    У кого-нибудь есть такой опыт? Насколько оно будет медленнее при выборке по id чем обычный INT?

    Спасиб)
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.236
    Адрес:
    там-сям
    Roman __construct нравится это.
  3. Roman __construct

    Roman __construct Активный пользователь

    С нами с:
    27 апр 2019
    Сообщения:
    1.270
    Симпатии:
    112
    спасибки!) самое то!
    --- Добавлено ---
    Правда сама тема сохранения в виде BIN немного мозг порушила :D

    Код (Text):
    1. CREATE TABLE `normal_uuid` (
    2.     `uuid` BINARY(16) NOT NULL,
    3.     `uuid_text` varchar(36) generated always as
    4.         (insert(
    5.             insert(
    6.                 insert(
    7.                     insert(hex(uuid),9,0,'-'),
    8.                 14,0,'-'),
    9.             19,0,'-'),
    10.             24,0,'-')
    11.         ) virtual,
    12.     `text` TEXT NOT NULL,
    13.     PRIMARY KEY (`uuid`)
    14. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    нужно будет потом покурить какой-нить мануал по теме, и найти готовый класс для всего этого )))
     
  4. villiwalla

    villiwalla Активный пользователь

    С нами с:
    14 дек 2016
    Сообщения:
    471
    Симпатии:
    70
    Нужен uuid? велком в Postgres.
     
  5. Roman __construct

    Roman __construct Активный пользователь

    С нами с:
    27 апр 2019
    Сообщения:
    1.270
    Симпатии:
    112
    А в чем принципиальное отличие от MYSQL ?

    Я с постгрес не работал просто
     
  6. villiwalla

    villiwalla Активный пользователь

    С нами с:
    14 дек 2016
    Сообщения:
    471
    Симпатии:
    70
    Ну по твоим месагам я предположил что у мускуля костыльно генерится uuid, поэтому сказал за постргес, что знаю у него это есть наверка. Но ошибся.
     
  7. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.236
    Адрес:
    там-сям
  8. Roman __construct

    Roman __construct Активный пользователь

    С нами с:
    27 апр 2019
    Сообщения:
    1.270
    Симпатии:
    112
    Начал читать - сходу замечание))

    Str::uuid();

    Это хелпер - генерит именно 4 версию. Мало того, есть вообще такая красота

    Str::eek:rderedUuid()
    The Str::eek:rderedUuid method generates a "timestamp first" UUID that may be efficiently stored in an indexed database column:

    use Illuminate\Support\Str;

    return (string) Str::eek:rderedUuid();

    ))))

    Я кстати узнал совсем недавно о нем - раньше тож пришлось как-то свой генератор набросать - хотя он был другой совсем - не как у него
    --- Добавлено ---
    Ахах)) со смайлами смешно получилось)))
    --- Добавлено ---
    ...но вообще почитав увидел что народ рекомендует таки постгри потому что там uuid это специальный тип поля т.е. без танцев с бубном)))
     
  9. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Если хранить UUID в поле типа binary то норм, никаких кодировок и collation, прямо как с интом.
     
    Roman __construct нравится это.
  10. Roman __construct

    Roman __construct Активный пользователь

    С нами с:
    27 апр 2019
    Сообщения:
    1.270
    Симпатии:
    112
    а как это правильно сделать?
     
  11. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Код (Text):
    1. CREATE TABLE ... `uuid` BINARY(36) NOT NULL ... PRIMARY KEY(`uuid`)
     
    Roman __construct нравится это.
  12. Roman __construct

    Roman __construct Активный пользователь

    С нами с:
    27 апр 2019
    Сообщения:
    1.270
    Симпатии:
    112
    я не подумал что это так просто))
    думал какие-то преобразования из текста в бинарный формат нужны или типа того
     
  13. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Любая строка есть набор байтов. Как раз более сложные типы, такие как VARCHAR, заставляют базу производить дополнительные операции над данными. А бинарные типы BINARY и BLOOB сообщают базе, что в эти поля нужно записывать строки "как есть" и читать, сравнивать, так же. Поэтому в этих полях, Е и Ё всегда будут считаться разными, потому что это разные наборы бит, а не одинаковми, как в varchar с collation *_general_ci где данные рассматриваются базой именно как текст.
    Сами по себе строки не содержат информации, как с ними работать, они всегда бинарны.
     
    artoodetoo и Roman __construct нравится это.
  14. Roman __construct

    Roman __construct Активный пользователь

    С нами с:
    27 апр 2019
    Сообщения:
    1.270
    Симпатии:
    112
    Спасибо. Но я еще раз уточню:

    То есть в запрос INSERT просто передать текстовое значение '123e4567-e89b-12d3-a456-426655440000' и всё? Этого достаточно?

    Я конечно попробую, но мне кажется что либо Лара либо БД ругнется на тип данных))
     
  15. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Да, дело серьезное, требует обстоятельной подготовки. Налей себе чайку или чего по-крепче. Прочитай гайд по лучшим практикам составления запросов к последней версии MariaDB. Набросай от руки структуру таблицы. Будь уверен, что все поля расставлены в логичном порядке, и ни одно не пропущено. Не спеша набери SQL запрос. Проверь синтаксис, расстановку ключей и что ни один из них не будет длиннее 192 байтов. Не забудь про кодировку и сравнение для всей таблицы, но не устанавливай их на поле uuid. Вместо этого, задай ему тип BINARY и длину в 36 байтов. И самое главное - первичный ключ. Всё. Можно выдохнуть, закрыть глаза и жать Enter.
     
    Roman __construct нравится это.
  16. Roman __construct

    Roman __construct Активный пользователь

    С нами с:
    27 апр 2019
    Сообщения:
    1.270
    Симпатии:
    112
    ))))))))))))))))))))))))

    мерси-мерси! :)
    --- Добавлено ---
    ...я кстати Марию потому и снес с виндовой локалки (она в XAMPP по умолчанию стоит) что из-за этих 192 байтов приходилось каждый раз патчить свежую установку Laravel - вроде пустяк, всего одно лишнее телодвижение, но в конце-концов оно меня достало, поставил MySQL
     
  17. vitvvs

    vitvvs Гость

    С нами с:
    16 окт 2020
    Сообщения:
    1
    Симпатии:
    0
    вообще-то binary(16) а не binary(36)
    ну вставка будет так
    INSERT INTO table (UUID) VALUES (UNHEX(REPLACE(UUID(), "-","")))