DEV Community

Flávio Luiz
Flávio Luiz

Posted on

História 1: A Jornada de Lory e a Indexação

Capítulo 1: O Início do Sistema de E-commerce
Lory, uma desenvolvedora entusiasta e cheia de ideias, começou a trabalhar em uma startup que tinha um e-commerce para atender pequenas lojas locais. Ela criou uma tabela simples com nome de Order para armazenar os pedidos, contendo colunas como OrderID, CustomerID, OrderDate e Amount. O sistema era rápido, pois os primeiros clientes tinham poucos pedidos.

No entanto, conforme o sucesso do sistema cresceu, mais lojas aderiram à plataforma e o volume de dados aumentou exponencialmente. Em poucos meses, a tabela Order acumulou milhões de registros. Lory percebeu o problema quando um lojista reclamou que ao tentar visualizar os pedidos de um cliente específico, a página levava minutos para carregar.

O Desafio da Performance
Lory investigou o problema e percebeu que a consulta abaixo, usada para filtrar os pedidos por cliente, estava realizando um table scan, varrendo linha por linha da tabela:

SELECT * FROM Order WHERE CustomerID = 12345;

Esse método era ineficiente, especialmente com milhões de registros. Ela sabia que precisava resolver o problema rapidamente, ou os lojistas começariam a abandonar sua plataforma.

A Solução com Indexação
Lory começou a estudar sobre técnicas de otimização de banco de dados e descobriu a indexação. Ela aprendeu que, ao criar um índice na coluna CustomerID, o banco de dados seria capaz de localizar os registros rapidamente, sem precisar examinar cada linha. Ela implementou o seguinte comando:

CREATE INDEX idx_customer_id ON Order(CustomerID);

O impacto foi imediato. Consultas que antes levavam minutos passaram a ser concluídas em segundos. Lory ficou satisfeita ao ver os lojistas elogiando a rapidez do sistema.

O Retorno do Desempenho Lento
Porém, nem tudo eram flores. Com o aumento do número de pedidos diários, Lory começou a notar uma lentidão nas operações de inserção de novos pedidos. Ela percebeu que, ao adicionar um novo pedido na tabela Order, o banco de dados também precisava atualizar o índice criado, o que estava consumindo tempo adicional.

Ela testou a seguinte query de inserção e confirmou a lentidão:

INSERT INTO Order (CustomerID, OrderDate, Amount) VALUES (12345, '2024-11-01', 150.00);

Lory entendeu que a indexação, embora eficiente para consultas, tinha um impacto negativo nas operações de escrita. Além disso, ela começou a notar que os índices criados estavam aumentando significativamente o espaço usado pelo banco de dados.

Capítulo 1.2: Lory e o Desafio das Inserções Lentas
Lory estava satisfeita com a solução de indexação que acelerou as consultas no sistema de e-commerce. As reclamações dos lojistas cessaram, e o sistema voltou a funcionar de forma eficiente. Porém, como todo bom desenvolvedor sabe, novos problemas sempre surgem quando um sistema cresce.

A Chegada do Problema
Meses depois, Lory notou que as operações de inserção começaram a ficar lentas. O volume de vendas no sistema havia disparado, com dezenas de pedidos sendo registrados a cada segundo. Os lojistas, empolgados com o crescimento de seus negócios, começaram a relatar que novos pedidos levavam mais tempo que o previsto, aumentando a desistência dos consumidores no site.

Lory investigou e percebeu que a lentidão estava diretamente relacionada aos índices que ela havia criado. A cada novo pedido inserido na tabela Order, o banco de dados precisava atualizar os índices associados, como o de CustomerID. Isso estava causando um impacto significativo na performance das operações de escrita.

Lory Buscou Algumas Soluções
Determinada a resolver o problema, Lory decidiu fazer uma pausa e pensar estrategicamente. Ela sabia que remover os índices não era uma opção, pois isso traria de volta o problema das consultas lentas. Então, ela começou a explorar alternativas para otimizar as inserções.

A Solução: Inserts Assíncronos
Pouco tempo depois, Lory percebeu que o crescimento contínuo do sistema poderia causar novos gargalos. Então, ela começou a planejar uma solução mais robusta. Ela adicionou filas para gerenciar as operações de inserção.

  • Implementação de Filas: Lory configurou uma fila de mensagens com RabbitMQ. Cada novo pedido era enviado para a fila e era processado por um serviço de inserção dedicado.

  • Inserção Assíncrona: O serviço inseria os dados no banco de dados em segundo plano, mantendo os índices atualizados sem impactar diretamente a experiência dos lojistas.

Com isso, o sistema ficou preparado para lidar com picos de vendas sem sobrecarregar o banco de dados.

Lory Aprende Sobre Particionamento
Mesmo com as otimizações, a tabela Order continuava crescendo. Lory começou a implementar o particionamento de tabelas para dividir os dados em blocos menores, como por ano ou mês. Assim, os índices de cada partição eram menores e mais rápidos de atualizar. Ela particionou a tabela Order com base no campo OrderDate:

CREATE TABLE Order_2024 (...);
CREATE TABLE Order_2025 (...);
Enter fullscreen mode Exit fullscreen mode

Agora, ao inserir um pedido de 2024, ela ia direto para a tabela Order_2024, reduzindo o impacto nos índices.

A Vitória
Graças às otimizações, o sistema de Lory continuou a crescer, suportando milhares de pedidos por minuto. Ela aprendeu que a indexação é essencial, mas o equilíbrio entre leitura e escrita é fundamental para o sucesso de um sistema em grande escala.

Lory tornou-se uma desenvolvedora mais experiente, entendendo que resolver problemas de performance é como ajustar uma máquina em constante movimento. E assim, o e-commerce prosperou, com seus lojistas cada vez mais satisfeitos.

Lições Aprendidas

  1. Indexação é Fundamental, Mas Exige Planejamento

    • A indexação acelera consultas ao organizar dados para buscas eficientes, mas pode impactar operações de escrita. É essencial balancear performance de leitura e escrita.
  2. Monitoramento Contínuo é Essencial

    • Sistemas em crescimento apresentam novos desafios. Monitorar consultas e analisar o uso de índices regularmente ajuda a identificar gargalos antes que eles se tornem problemas críticos.
  3. Assincronismo para Melhor Escalabilidade

    • A implementação de filas com RabbitMQ e inserções assíncronas desacoplou a escrita da lógica principal do sistema, permitindo lidar com picos de vendas sem afetar a experiência do usuário.
  4. Particionamento de Dados Aumenta a Eficiência

    • Dividir tabelas grandes em partições menores, como por ano ou mês, ajuda a manter os índices mais leves e rápidos, reduzindo o impacto tanto na leitura quanto na escrita.
  5. O Equilíbrio é a Chave

    • Nem sempre a solução para um problema será universal. Lory entendeu que a performance exige ajustes contínuos, considerando as demandas específicas de leitura e escrita.
  6. Planejamento Previne Problemas Futuros

    • Estratégias como índices e o uso de filas prepararam o sistema de Lory para crescer sem comprometer a performance.

7.Aprendizado e Adaptação Constantes

  • Lory mostrou que ser uma boa desenvolvedora não é apenas implementar soluções, mas também revisar e aprimorar estratégias continuamente, acompanhando o crescimento do sistema.

Essas lições são aplicáveis a qualquer sistema em crescimento e ilustram como desafios técnicos podem ser superados com planejamento estratégico e um mindset de aprendizado contínuo.

Top comments (0)