Cuidado com UUID em bancos relacionais!

āđāļŠāļĢāđŒ
āļāļąāļ‡
  • āđ€āļœāļĒāđāļžāļĢāđˆāđ€āļĄāļ·āđˆāļ­ 23 āļ.āļĒ. 2024
  • 💎 Quer aprender tÃģpicos avançados de desenvolvimento e liderança? Venha para a TechLeads.club comece.techlea...
    UUIDs podem causar um grande impacto negativo no desempenho de bancos de dados relacionais como MySQL e PostgreSQL devido a sua natureza randÃīmica.
    Nesse vídeo eu explico porque UUIDs sÃĢo problemÃĄticos e quais as melhores opçÃĩes para resolver esse problema.
    🔗 Links
    - planetscale.co...
    - shopify.engine...

āļ„āļ§āļēāļĄāļ„āļīāļ”āđ€āļŦāđ‡āļ™ • 62

  • @cardeal1389
    @cardeal1389 6 āļ§āļąāļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē +35

    UUID V7 e ULID, para os casos em que precisamos de performance e índices ao se trabalhar com grandes quantidades de dados.

    • @yetanothercoder
      @yetanothercoder 5 āļ§āļąāļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē

      Ia comentar isso.

    • @allandasilvaa
      @allandasilvaa 3 āļ§āļąāļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē

      Que Ãģtimo, foi o que eu imaginei.

  • @leandrosoares6
    @leandrosoares6 5 āļ§āļąāļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē +18

    ConteÚdo raro de excelente qualidade em menos de 5 minutos ðŸ˜Ū

  • @viniciusvasques4015
    @viniciusvasques4015 5 āļ§āļąāļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē +23

    Poderia ser um vídeo de 10+ minutos de sensacionalismo porÃĐm entregou todo conteÚdo em menos de 5 com qualidade. Isso que ÃĐ respeitar o tempo do prÃģximo, perfeito.

    • @WaldemarNetoDevLab
      @WaldemarNetoDevLab  5 āļ§āļąāļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē +4

      Haha boa, produzo o vídeo que eu gostaria de assistir ðŸĪĢðŸĪĢ

    • @geandresm
      @geandresm āļ§āļąāļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē

      Me inscrevi na hora por isso

  • @rhialicandido8644
    @rhialicandido8644 2 āļ§āļąāļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē +7

    Eu uso o ID com o index e o UUID como string, varchar, quando retorno os dados para o usuÃĄrio eu escondo o ID e apresento apenas o UUID em tela, isso jÃĄ resolve o meu problema ehehee!

  • @iannascimento913
    @iannascimento913 āļ§āļąāļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē

    ParabÃĐns pelo conteÚdo direto ao ponto, ainda mais pra nÃģs de tecnologia que nÃĢo gostamos de enrolaçÃĢo hahaha

  • @FÃĄbioLima-h7k
    @FÃĄbioLima-h7k 5 āļ§āļąāļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē +4

    Muito bom! Resume toda a questÃĢo e apresenta uma soluçÃĢo. Apenas faltou dizer que ÃĐ preferível persistir o ULID/UUIDv7 como UUID/GUID (quando suportado pelo BD) ou binÃĄrio (quando nÃĢo). As pessoas tendem a associar UUID com uma string, quando na verdade ÃĐ um nÚmero.

  • @ManoelJunior
    @ManoelJunior 13 āļŠāļąāđˆāļ§āđ‚āļĄāļ‡āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē

    Obrigado por compartilhar conosco.

  • @aldycolares3663
    @aldycolares3663 āļ§āļąāļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē

    Bom conhecimento. Vou ver outros vídeos jÃĄ que tu falou que aborda assuntos avançados.

  • @dami-i
    @dami-i āļ§āļąāļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē

    Esse tipo de conteÚdo ÃĐ bem bacana. Embora fiquei perdido algumas vezes por conta da pronÚncia do termo "UUID" se confundir com "o ID". Seria mais fÃĄcil de fazer a distinçÃĢo se fosse usada a pronÚncia em inglÊs "you you ID".

  • @JRRRRRRRRRRR
    @JRRRRRRRRRRR 4 āļ§āļąāļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē +1

    muito bom, por mais vídeos assim, tÃĐcnicos , objetivos, dando uma visÃĢo geral com soluçÃĩes, desses desafios que temos nos projetos 👏👏👏

  • @Afonsolelis2
    @Afonsolelis2 2 āļ§āļąāļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē

    Perfeito, jÃĄ virei fÃĒ do seu trabalho!

  • @shift564
    @shift564 5 āļ§āļąāļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē +2

    muito bom o conteÚdo, deixou claro que isso ÃĐ preocupaçÃĢo de grande escala, sobre storage, hoje vejo JR se preocupando com storage sendo que o guri nÃĢo tem 100 usuÃĄrio na plataforma...

  • @ursochurrasqueira
    @ursochurrasqueira 5 āļ§āļąāļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē +2

    tem o snowflake id criado pelo twitter, ainda nÃĢo cheguei a usar mas parece interessante

  • @weller781
    @weller781 2 āļ§āļąāļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē +1

    Uma soluçÃĢo que encontrei para ter um hash e o Id sequencial foi: fazer a coluna id auto incrementada e ao ter o dado jÃĄ persistido no banco, pegar esse id gerado automaticamente e transformar ele em hash usando SHA256 e fazer o update na coluna x que salva o hash, para o front mando esse hash correspondente ao Id sequencial. Na ÃĐpoca que implementei essa lÃģgica eu sabia pouco sobre bancos e nÃĢo queria ter o Id sequencial no front justamente para evitar que o usuÃĄrio burlasse os dados exibidos. Achei meio gambiarra mas foi uma soluçÃĢo que estÃĄ servindo bem rsrs

  • @davidmolizane
    @davidmolizane 5 āļ§āļąāļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē

    ConteÚdo de simples comunicaçÃĢo e rico em conhecimento, obrigado pelo vídeo mano

  • @adeonir
    @adeonir 5 āļ§āļąāļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē

    Ótima explicaçÃĢo.
    Eu cheguei a usar CUID em algumas aplicaçÃĩes, ele tambÃĐm ÃĐ ordenÃĄvel e ocupa menos espaço por ser mais curto.

  • @gabrieljose7041
    @gabrieljose7041 āļ§āļąāļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē

    Muito bom o vídeo parabÃĐns!! Me conta aí oq tu acha de prefixo ou sufixo de IDs? Eu tenho tentado adotar isso em projetos com muitas entidades e principalmente quando tem muitas entidades relacionadas a um fluxo sÃģ, fica mais simples de saber a quem aquele ID se refere

  • @carlotadias9335
    @carlotadias9335 3 āļ§āļąāļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē

    Muito interessante ! Obrigada !

  • @aldairavelino3188
    @aldairavelino3188 5 āļ§āļąāļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē

    Bem explicado, valeu por compartilhar

  • @jamesortiz
    @jamesortiz 5 āļ§āļąāļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē

    Ótima informaçÃĢo, vai ajudar muito, obrigado!

  • @polvoazul
    @polvoazul 2 āļ§āļąāļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē

    Uma vantagem: com UUID v4 vc pode gerar novas chaves direto no cliente, sem precisar falar com o banco, salvando um roundtrip em alguns casos.
    Uma desvantagem: UUID sendo maior, vc gasta mais storage, o q nao eh mt relevante, mas o seus indexes ficam maiores (pq em geral vc vai ter index em ids), e ae vao caber menos no cache de memoria, e isso pode sim ter um impacto relevante em performance (pq memoria nao eh tao barato assim).

  • @joalisonpereiradev
    @joalisonpereiradev 5 āļ§āļąāļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē

    Vídeo curto mas miuto informativo, valeu.

  • @viniciuspimentel8690
    @viniciuspimentel8690 6 āļ§āļąāļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē

    Muito brabo, jamais pensaria nisso!

  • @rft13hk
    @rft13hk 3 āļ§āļąāļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē

    Uma opçÃĢo que usamos ÃĐ criar uma chave composta de um campo date + UUID, assim o índice sÃģ precisa percorrer a chave da data do dia da gravaçÃĢo.

  • @ericnevesr
    @ericnevesr 5 āļ§āļąāļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē

    Excelente conteÚdo, muito bom!

  • @RobsonFeDev
    @RobsonFeDev 5 āļ§āļąāļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē

    Ótimo conteÚdo, parabÃĐns!! TambÃĐm me proecupo bastante com a performance do banco, sÃģ que ao mesmo tempo voce tem que se atentar a segurança, eu ainda nÃĢo utilizei esses UUID mencionados, mas sempre pensei que pelo uuid padrÃĢo ser muito randÃīmico, ele nÃĢo ÃĐ uma escolha ideal para aplicaçÃĩes grandes, realizar query de grande volume de dados.

    • @WaldemarNetoDevLab
      @WaldemarNetoDevLab  3 āļ§āļąāļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē +1

      Valeu Robson! Na verdade na query nÃĢo tem problema de ele ser randÃīmico. NÃĢo interfere em nada.

  • @dantemesquita7751
    @dantemesquita7751 5 āļ§āļąāļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē

    Que vídeo incrível obrigado

  • @MakerVerse
    @MakerVerse 5 āļ§āļąāļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē

    Nossa video sensacional obrigado

  • @AlvesNamor
    @AlvesNamor 14 āļŠāļąāđˆāļ§āđ‚āļĄāļ‡āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē

    E quais bancos de dados tem suporte a UUID v7 sabendo da ordenaçÃĢo temporal?

  • @FlavioAugustoToldo
    @FlavioAugustoToldo 3 āļ§āļąāļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē

    como saber qual a versÃĢo estÃĄ sendo usada?

  • @tiagoleomil4329
    @tiagoleomil4329 3 āļ§āļąāļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē

    Ganhou mais um inscrito

  • @rafa_veiga
    @rafa_veiga 5 āļ§āļąāļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē

    Confesso que fiquei mto tempo parado usando o uuid v4, as prÃģximas vou usar o v7 pra ver a diferença.

  • @Pedroallesss
    @Pedroallesss 5 āļ§āļąāļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē

    mt bom!

  •  5 āļ§āļąāļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē

    Muito bom o vídeo!
    Esse carÃĄter de aleatoriedade impacta, de fato, o índice do tipo b-tree. Mas se utilizarmos o tipo de índice hash, nÃĢo mitigamos o problema?
    Ficaremos limitados a operaçÃĢo de match exato, mas que parece ser o normal quando estamos falando de chave primÃĄria e de UUID.
    Acha vÃĄlido?

    • @WaldemarNetoDevLab
      @WaldemarNetoDevLab  3 āļ§āļąāļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē +1

      Bom ponto! Problema do hash ÃĐ que ele ÃĐ chave e valor e ÃĐ limitado comparado ao b-tree e tambÃĐm quando testei o MySQL, por exemplo, nÃĢo suportava hash para chaves primarias.

  • @oazevedolucas
    @oazevedolucas 5 āļ§āļąāļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē

    Cara eu tenho uma dÚvida. Se eu vou trabalhar com grande quantidade de usuarios exemplo +1milhÃĢo, nÃĢo chega um ponto que extoura o maior nÚmero possível?

    • @HumbertoRamosCosta
      @HumbertoRamosCosta 5 āļ§āļąāļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē

      1 milhÃĢo de registros em bancos de dados hoje ÃĐ trivial
      Mesmo que vocÊ delete e crie outros registros ÃĐ praticamente impossível ultrapassar o espaço amostral tanto do UID quanto da chave sequencial.

  • @infocastell
    @infocastell 5 āļ§āļąāļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē

    Legal, nÃĢo sabia disso. JÃĄ salvei. Valeu!

  • @RenanMiranda-c1o
    @RenanMiranda-c1o 5 āļ§āļąāļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē

    jÃĄ escutei isso algumas vezes, porÃĐm nÃĢo concordo muito...
    a complexidade de inserçÃĢo de um elemento em uma ÃĄrvore binÃĄria balanceada, ÃĐ O(Log(N)), independente se ÃĐ randomico ou ordenado, internamente ele vai comparar um UUID com outro da mesma forma que um nÚmero ÃĐ comparado, para jogar ele para esquerda ou direita em cada nível da ÃĄrvore.
    mesmo que o banco aproveitasse o fato de ser sequencial para nÃĢo criar uma ÃĄrvore e sim algo prÃģximo a uma lista bulkerizada ordenada, onde a complexidade de insert seria O(1) (o que desconheço que ele faça), o UUID vai ter que ter um indice de qualquer forma, para buscar pela chave, na maioria das vezes um campo de cÃģdigo desses nÃĢo fica sem indice, dessa forma a complexidade do insert nÃĢo vai mudar mesmo vocÊ tendo uma PK numÃĐrica.
    Vai haver uma melhoria nos JOINS, porque que individualmente comparar um uuid com outro ÃĐ mais custoso do que comparar um nÚmero com outro, devido a quantidade de bits de um uuid ser muito superior, contudo ÃĐ uma diferença constante na complexidade, nÃĢo ÃĐ linear, nem exponencial, o que nÃĢo deveria ser um grande problema na prÃĄtica. (tanto a consulta por UUID numa BTREE quanto a por Numero tem complexidade O(Log(N)))
    convivo com aplicaçÃĩes que lidam com grandes quantidades de dados e requisiçÃĩes e trabalham com UUID na chave, e esse nunca foi o problema, o tempo das queries costuma ser semelhante a de aplicaçÃĩes que tenho com volume de dados parecido e chave numÃĐrica, por ser uma diferença constante de performance, nÃĢo linear nem exponencial, costuma ser pouco perceptivel, o que mais costuma fazer diferença ÃĐ o plano de execuçÃĢo das consultas, e ter os indices criados corretamente para cada situaçÃĢo.
    Fora isso a complexidade de gerar um numero auto increment ÃĐ maior que gerar um UUID, vocÊ precisa de um mecanismo de sequence para isso, que geralmente nÃĢo ÃĐ escalavel, porque que ÃĐ um mecanismo thread-safe para geraçÃĢo de nÚmeros sequenciais, contudo, para ele ser thread-safe, precisa sincronizar a operaçÃĢo, ou seja, todas as threads da sua aplicaçÃĢo em todas as instancias que ela tiver rodando, vÃĢo ter que aguardar uma a outra, para geraçÃĢo desse id numÃĐrico.
    Mas assim, concordo que hÃĄ de fato uma melhora constante nas operaçÃĩes de consulta, mas pra min nunca justificou a troca, trabalho com microsserviços que fazem centenas de milhares de consultas ao banco por minuto, com centenas de milhÃĩes de dados em banco, e nunca tive problema com isso.
    Talvez se for um cenÃĄrio super extremo, com bilhÃĩes de dados, e milhÃĩes de consultas por minuto, esse tipo de otimizaçÃĢo começe a fazer uma diferença maior, mas vejo que ÃĐ a minoria dos casos.

    • @WaldemarNetoDevLab
      @WaldemarNetoDevLab  3 āļ§āļąāļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē

      Massa teu ponto Renan, tu jÃĄ fez benchmarks de escrita? Atualmente estou trabalhando em um SaaS multi tenant com milhares de dados e os benchmakrs de escrita diferem bastante quando movemos de uuid v4 para v7 em operaçÃĩes de escrita que precisam mexer no index. Sobre query eu nem mencionei porquÊ o impacto ÃĐ realmente minimo.

  • @jeffersonsilva763
    @jeffersonsilva763 5 āļ§āļąāļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē

    Gostaria de saber como isso iria implicar em um banco de dados de escrita escalando na horizontal, recebendo multiplas inserçÃĩes no mesmo milisegundos em uma alta demanda. Pois o twitter usa o "Snowflake" pra resolver esse problema.

    • @WaldemarNetoDevLab
      @WaldemarNetoDevLab  3 āļ§āļąāļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē

      Massa Jefferson, em termos de escrita nÃĢo tem problema nenhum. O Twitter usa o snowflake porquÊ ele ÃĐ menor e tambÃĐm nÃĢo tinham muitos padrÃĩes ordenÃĄveis no passado.

  • @kelvincesar_
    @kelvincesar_ 5 āļ§āļąāļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē

    No postgres vocÊs usam a extensÃĢo do ulid? Ou criam ele na camada de app e armazenam como uuid mesmo?

    • @WaldemarNetoDevLab
      @WaldemarNetoDevLab  3 āļ§āļąāļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē +1

      Sempre criei no app, para nÃĢo depender muito do banco para isso.

    • @kelvincesar_
      @kelvincesar_ 3 āļ§āļąāļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē

      @@WaldemarNetoDevLab boa, tambÃĐm acho mais fÃĄcil. Abraço e parabÃĐns pelo vídeo!

  • @VictorHenrique17
    @VictorHenrique17 5 āļ§āļąāļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē

    Setar o indice pra usar hash jÃĄ nÃĢo resolve o problema ?

    • @WaldemarNetoDevLab
      @WaldemarNetoDevLab  3 āļ§āļąāļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē

      Bom ponto! Problema do hash ÃĐ que ele ÃĐ chave e valor e ÃĐ limitado comparado ao b-tree e tambÃĐm quando testei o MySQL, por exemplo, nÃĢo suportava hash para chaves primarias.

  • @zkira445
    @zkira445 4 āļ§āļąāļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē +1

    E a chave aleatÃģria do pix? Kkk

  • @cleitinho-dev
    @cleitinho-dev 5 āļ§āļąāļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē

    DÚvida o KSUID ÃĐ uma boa soluçÃĢo?

    • @WaldemarNetoDevLab
      @WaldemarNetoDevLab  5 āļ§āļąāļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē +1

      Nunca testei mas ÃĐ um padrÃĢo estÃĄvel, acho que ÃĐ uma opçÃĢo valida.

  • @joonasalb
    @joonasalb 5 āļ§āļąāļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē

    DÚvida, como o banco sabe lidar com a ordenaçÃĢo de acordo com caracteres? como que esse sabe que esse cara por exemplo: 018aab68-d2dd-78f1.. ÃĐ antes do 018aab68-d2dd-78f2?
    Por que eu digo, como o UUID ÃĐ aleatÃģrio, ele acaba ordenadando mesmo assim porÃĐm a ordenaçÃĢo acabaria estando errado? kkkkkk fiquei muito nessa dÚvida

    • @WaldemarNetoDevLab
      @WaldemarNetoDevLab  3 āļ§āļąāļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē +1

      Essa ÃĐ uma Ãģtima pergunta, como o timestamp estÃĄ no início, comparar duas strings de UUID v7 em ordem lexicogrÃĄfica (alfabÃĐtica) reflete a ordem temporal em que foram geradas. Índices B-Tree utilizam a ordem lexicogrÃĄfica das chaves para organizar os dados. Portanto, UUIDs v7 se beneficiam diretamente dessa característica, permitindo buscas e ordenaçÃĩes eficientes.

  • @Kimitri
    @Kimitri 5 āļ§āļąāļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē

    tem como fazer isso depois q jÃĄ tem um banco de dados sÃģ com uuids ?

    • @WaldemarNetoDevLab
      @WaldemarNetoDevLab  3 āļ§āļąāļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē

      Puts, ai da trabalho, tem que atualizar todos os relacionamentos, e se existem sistemas externos que dependem dos dados e salvam o id no lado deles vai ser bem dificil.

  • @romulo123skate
    @romulo123skate 5 āļ§āļąāļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē

    niceeee