<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Matias Solis</title>
    <description>The latest articles on DEV Community by Matias Solis (@matiasolisbello).</description>
    <link>https://dev.to/matiasolisbello</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F866236%2Fd738cb4a-243c-4616-b503-f4dd117a4581.jpeg</url>
      <title>DEV Community: Matias Solis</title>
      <link>https://dev.to/matiasolisbello</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/matiasolisbello"/>
    <language>en</language>
    <item>
      <title>Problemas que matan el rendimiento en Django ⚠️</title>
      <dc:creator>Matias Solis</dc:creator>
      <pubDate>Sat, 28 Feb 2026 20:11:40 +0000</pubDate>
      <link>https://dev.to/matiasolisbello/problemas-que-matan-el-rendimiento-en-django-aj</link>
      <guid>https://dev.to/matiasolisbello/problemas-que-matan-el-rendimiento-en-django-aj</guid>
      <description>&lt;h2&gt;
  
  
  Índice 📑
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Consultas N+1&lt;/li&gt;
&lt;li&gt;Falta de índices en la base de datos&lt;/li&gt;
&lt;li&gt;Evaluación prematura del QuerySet&lt;/li&gt;
&lt;li&gt;Cargar datos innecesarios (overfetching)&lt;/li&gt;
&lt;li&gt;Falta de select related y prefetch related&lt;/li&gt;
&lt;li&gt;Uso incorrecto de count()&lt;/li&gt;
&lt;li&gt;No usar transacciones correctamente&lt;/li&gt;
&lt;li&gt;No usar bulk operations&lt;/li&gt;
&lt;li&gt;Uso eficiente de annotate()&lt;/li&gt;
&lt;li&gt;No usar django debug toolbar&lt;/li&gt;
&lt;li&gt;No usar django silk para profiling&lt;/li&gt;
&lt;li&gt;Conclusión&lt;/li&gt;
&lt;li&gt;Linkografía&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Consultas N+1 🐌
&lt;/h2&gt;

&lt;p&gt;Es un cuello de botella de rendimiento común en aplicaciones que interactúan con bases de datos. Ocurre cuando una aplicación ejecuta N consultas adicionales para recuperar datos que podrían haberse obtenido con una sola consulta. Esto da como resultado N+1 consultas totales en lugar de solo 1, lo que genera una degradación significativa del rendimiento, especialmente a medida que crece su conjunto de datos.&lt;/p&gt;

&lt;p&gt;Ejemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;post&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;author&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto genera 1 consulta para posts + N consultas para autores&lt;/p&gt;

&lt;p&gt;Esto en Django se soluciona agregando el método &lt;code&gt;select_related&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;posts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;select_related&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;author&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;post&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;author&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Falta de índices en la base de datos 📚
&lt;/h2&gt;

&lt;p&gt;Los &lt;code&gt;índices&lt;/code&gt; optimizan la recuperación de información en una tabla, permitiendo consultas más rápidas sin necesidad de recorrer todos los registros.&lt;/p&gt;

&lt;p&gt;Este es uno de los problemas más comunes en aplicaciones con grandes volúmenes de datos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;test@gmail.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sin índices, ocurre un escaneo completo de la tabla. En producción con millones de filas provoca una degradación severa del rendimiento.&lt;/p&gt;

&lt;p&gt;Para agregar un índice en el ORM de Django, debes usar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Model&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;EmailField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;db_index&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Evaluación prematura del QuerySet ⚡
&lt;/h2&gt;

&lt;p&gt;Los QuerySets son lazy, pero muchos los evalúan de forma errónea:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;qs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;qs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="bp"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Un uso correcto de es verificar su existencia con &lt;code&gt;exists()&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;qs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exists&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El método &lt;code&gt;exists()&lt;/code&gt; es útil para búsquedas relacionadas con la existencia de objetos en un QuerySet; devuelve "True" si el QuerySet contiene resultados y "False" si no. Intenta ejecutar la consulta de la forma más sencilla y rápida posible. No es adecuado cuando necesitas acceder a los objetos posteriormente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cargar datos innecesarios (overfetching) 📦
&lt;/h2&gt;

&lt;p&gt;Al realizar una consulta donde necesitas todos los datos de una tabla. Ejecutarías:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pero ¿Y si solo necesitas el name (además del id)? Deberias solicitar solo a ese dato. Para eso existe &lt;code&gt;only()&lt;/code&gt;, &lt;code&gt;values()&lt;/code&gt; o &lt;code&gt;values_list()&lt;/code&gt; dependiendo del tipo de estructura de datos que quieras retornar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Retorna una instancia del modelo
&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;only&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;o&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Retorna un diccionario
&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;values&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;o&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Retorna listas de tuplas
&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;values_list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;flat&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Falta de select related y prefetch related 🔗
&lt;/h2&gt;

&lt;p&gt;Al utilizar Django ORM, acceder a objetos relacionados puede causar el problema de consulta N+1, donde se ejecutan múltiples consultas de base de datos innecesarias. Django proporciona &lt;code&gt;select_related()&lt;/code&gt; y &lt;code&gt;prefetch_related()&lt;/code&gt; para resolver esto y mejorar el rendimiento.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;select_related()&lt;/strong&gt; recupera objetos relacionados en una única consulta SQL mediante JOIN. Más adecuado para relaciones ForeignKey y OneToOneField.&lt;/p&gt;

&lt;p&gt;Ejemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;select_related&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;author&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En cambio &lt;strong&gt;prefetch_related()&lt;/strong&gt; ejecuta consultas de base de datos separadas y combina los resultados en Python. Más adecuado para relaciones ManyToMany, ForeignKey inversas y OneToOne inversas&lt;/p&gt;

&lt;p&gt;Ejemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;books&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Book&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;prefetch_related&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;authors&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;book&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;books&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;book&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;author&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;book&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;authors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;author&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En casos más complejos, donde necesites usar prefetch_related + filtrado, ordenado, etc. Django proporciona el objeto &lt;strong&gt;Prefetch&lt;/strong&gt;, que permite tener un control más preciso sobre cómo se cargan los datos relacionados.&lt;/p&gt;

&lt;p&gt;Esto es útil cuando necesitas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Filtrar los objetos relacionados&lt;/li&gt;
&lt;li&gt;Ordenarlos&lt;/li&gt;
&lt;li&gt;O asignarlos a un atributo personalizado&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ejemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;django.db.models&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Prefetch&lt;/span&gt;

&lt;span class="n"&gt;books&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Book&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;prefetch_related&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nc"&gt;Prefetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;authors&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;queryset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;Author&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;active&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;book&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;books&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;author&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;book&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;authors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;author&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Uso incorrecto de count() 🔢
&lt;/h2&gt;

&lt;p&gt;El método &lt;code&gt;count()&lt;/code&gt; devuelve un &lt;strong&gt;número entero&lt;/strong&gt; que representa la cantidad de objetos en la base de datos que coinciden con el QuerySet.&lt;/p&gt;

&lt;p&gt;Ejemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;count&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Un mal uso de devolver lo mismo que count() es:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;count()&lt;/code&gt; ejecuta &lt;code&gt;SELECT COUNT(*)&lt;/code&gt; directamente en la base de datos, mientras que &lt;code&gt;len()&lt;/code&gt; carga todos los objetos en memoria.&lt;/p&gt;

&lt;h2&gt;
  
  
  No usar transacciones correctamente 🔒
&lt;/h2&gt;

&lt;p&gt;Django utiliza autocommit por defecto, lo que significa que cada operación &lt;code&gt;.save()&lt;/code&gt;, &lt;code&gt;.create()&lt;/code&gt; o &lt;code&gt;.update()&lt;/code&gt; se ejecuta como una transacción independiente.&lt;/p&gt;

&lt;p&gt;Esto tiene dos consecuencias importantes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mayor overhead por múltiples commits&lt;/li&gt;
&lt;li&gt;Riesgo de inconsistencias si ocurre un error a mitad de una operación compleja&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Problema común:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;processed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
    &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aquí Django ejecuta: 1 UPDATE = 1 COMMIT por cada iteración. Si tienes 10.000 objetos, tendrás: 10.000 commits, esto produce overhead innecesario y mayor tiempo total de ejecución&lt;/p&gt;

&lt;p&gt;La solución con &lt;code&gt;transaction.atomic()&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;django.db&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;transaction&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;atomic&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;processed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
        &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora Django ejecuta: 10.000 UPDATE = 1 solo COMMIT, pero no reduce las queries&lt;/p&gt;

&lt;h2&gt;
  
  
  No usar bulk operations 🚀
&lt;/h2&gt;

&lt;p&gt;Este método inserta la lista de objetos proporcionada en la base de datos de manera eficiente y devuelve los objetos creados como una lista, en el mismo orden proporcionado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;bulk_create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Uso eficiente de annotate() 📊
&lt;/h2&gt;

&lt;p&gt;El método &lt;strong&gt;annotate()&lt;/strong&gt; permite agregar información calculada a cada objeto del QuerySet usando agregaciones SQL. Esto evita ejecutar consultas adicionales innecesarias.&lt;/p&gt;

&lt;p&gt;Problema común:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;posts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;post&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;comments&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;count&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto genera:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1 consulta para los posts&lt;/li&gt;
&lt;li&gt;N consultas adicionales para contar los comentarios (problema N+1)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Solución con annotate():&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;django.db.models&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Count&lt;/span&gt;

&lt;span class="n"&gt;posts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;annotate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;comment_count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;Count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;comments&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;post&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;comment_count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto genera una consulta SQL, ya que el conteo se realiza en la base de datos.&lt;/p&gt;

&lt;p&gt;Ventajas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reduce el número de consultas&lt;/li&gt;
&lt;li&gt;Aprovecha la optimización del motor de base de datos&lt;/li&gt;
&lt;li&gt;Mejora significativamente el rendimiento en grandes volúmenes de datos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;También puedes usar otras funciones como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;django.db.models&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Sum&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Avg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Max&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Min&lt;/span&gt;

&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;annotate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;post_count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;Count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;posts&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;avg_score&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;Avg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;posts__score&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  No usar django debug toolbar 🔎
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;django-debug-toolbar&lt;/code&gt; es una herramienta que permite ver información detallada sobre el rendimiento de tu aplicación en tiempo real.&lt;/p&gt;

&lt;p&gt;Entre otras cosas, muestra:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Número de consultas SQL ejecutadas&lt;/li&gt;
&lt;li&gt;Tiempo de ejecución de cada consulta&lt;/li&gt;
&lt;li&gt;Queries duplicadas&lt;/li&gt;
&lt;li&gt;Tiempo total de respuesta&lt;/li&gt;
&lt;li&gt;Uso de caché&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esto permite detectar problemas como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Consultas N+1&lt;/li&gt;
&lt;li&gt;Consultas innecesarias&lt;/li&gt;
&lt;li&gt;Consultas lentas&lt;/li&gt;
&lt;li&gt;Falta de índices&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  No usar django silk para profiling 🔬
&lt;/h2&gt;

&lt;p&gt;Optimizar sin medir es uno de los errores más comunes. &lt;code&gt;django-silk&lt;/code&gt; es una herramienta de profiling que permite analizar el rendimiento real de tu aplicación. A diferencia de django-debug-toolbar, django-silk:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Guarda historial de requests&lt;/li&gt;
&lt;li&gt;Permite analizar queries en detalle&lt;/li&gt;
&lt;li&gt;Muestra tiempo de ejecución exacto&lt;/li&gt;
&lt;li&gt;Permite profiling de funciones Python&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusión 🎯
&lt;/h2&gt;

&lt;p&gt;El rendimiento de nuestras aplicaciones es vital para evitar frustraciones a nuestros clientes que manejan una gran cantidad de datos, más aun si se tratan de procesos críticos de una empresa. Este es uno de los factores que nosotros, como desarrolladores, debemos tener en cuenta al momento de programar soluciones.&lt;/p&gt;

&lt;p&gt;¿Qué te pareció este blog? ⚖️&lt;br&gt;
¿Tienes alguna critica constructiva para aportar? 💭&lt;br&gt;
¿Conoces algún otro método para optimizar el rendimiento de aplicaciones hechas con Django? ✍&lt;/p&gt;

&lt;p&gt;Te leo en los comentarios!! 🧐📖&lt;/p&gt;

&lt;h2&gt;
  
  
  Linkografía 📖
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.djangoproject.com/en/6.0/ref/models/querysets/#select-related" rel="noopener noreferrer"&gt;https://docs.djangoproject.com/en/6.0/ref/models/querysets/#select-related&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.w3schools.com/sql/sql_create_index.asp" rel="noopener noreferrer"&gt;https://www.w3schools.com/sql/sql_create_index.asp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.djangoproject.com/en/6.0/ref/models/querysets/#exists" rel="noopener noreferrer"&gt;https://docs.djangoproject.com/en/6.0/ref/models/querysets/#exists&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.djangoproject.com/en/6.0/ref/models/querysets/#count" rel="noopener noreferrer"&gt;https://docs.djangoproject.com/en/6.0/ref/models/querysets/#count&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.djangoproject.com/en/6.0/topics/db/transactions/" rel="noopener noreferrer"&gt;https://docs.djangoproject.com/en/6.0/topics/db/transactions/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.djangoproject.com/en/6.0/ref/models/querysets/#bulk-create" rel="noopener noreferrer"&gt;https://docs.djangoproject.com/en/6.0/ref/models/querysets/#bulk-create&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>django</category>
      <category>performance</category>
      <category>python</category>
      <category>spanish</category>
    </item>
    <item>
      <title>Conceptos clave (y confusos) del examen AWS Cloud Practitioner CLF-C02</title>
      <dc:creator>Matias Solis</dc:creator>
      <pubDate>Tue, 29 Jul 2025 20:44:14 +0000</pubDate>
      <link>https://dev.to/matiasolisbello/conceptos-clave-y-confusos-del-examen-aws-cloud-practitioner-clf-c02-17f4</link>
      <guid>https://dev.to/matiasolisbello/conceptos-clave-y-confusos-del-examen-aws-cloud-practitioner-clf-c02-17f4</guid>
      <description>&lt;p&gt;Hace aproximadamente un mes, comencé a estudiar para rendir el examen AWS Certified Cloud Practitioner CLF-C02. Durante este proceso, encontré múltiples conceptos que pueden prestarse a confusión, ya sea por sus nombres similares o porque sus nombres no reflejan con precisión su funcionalidad. Este post tiene como objetivo resumir brevemente los conceptos que, desde mi experiencia, resultaron más difíciles de entender o memorizar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Security Groups vs NACL
&lt;/h2&gt;

&lt;p&gt;Vamos con un concepto de seguridad de red, los security groups y los NACL (Listas de Control de Acceso a la Red) son muy fáciles de confundir puesto que cumplen la misma función, pero en realidad operan en distintos niveles de la red.&lt;/p&gt;

&lt;p&gt;Por un lado, los &lt;strong&gt;Security Group&lt;/strong&gt; son firewalls virtuales, que se aplican a nivel de &lt;u&gt;instancia&lt;/u&gt; y solo permiten reglas de permitir. No requieren configurar denegaciones ni salidas manuales para respuestas.&lt;/p&gt;

&lt;p&gt;En cambio, los &lt;strong&gt;NACLs&lt;/strong&gt; son firewalls a nivel de &lt;u&gt;subred&lt;/u&gt;, es decir, permiten tanto reglas de permitir como de denegar tráfico. Son útiles para bloquear direcciones IP específicas de forma general para todos los recursos dentro de una subred.&lt;/p&gt;

&lt;h2&gt;
  
  
  GuardDuty vs Amazon Inspector
&lt;/h2&gt;

&lt;p&gt;Vamos con conceptos de seguridad nativos de AWS, GuardDuty y Amazon Inspector son muy similares, ambos realizan análisis automatizados, pero se diferencian en lo que analizan.&lt;/p&gt;

&lt;p&gt;Por un lado, &lt;strong&gt;GuardDuty&lt;/strong&gt; hace análisis de los registros de AWS para &lt;u&gt;identificar comportamientos sospechosos (amenazas)&lt;/u&gt;, por ejemplo, detecta un escaneo de puertos desde una IP externa hacia una instancia EC2 y genera una alerta automática para investigar el incidente.&lt;/p&gt;

&lt;p&gt;En cambio, &lt;strong&gt;Amazon Inspector&lt;/strong&gt; hace análisis automatizados de &lt;u&gt;vulnerabilidades en recursos desplegados en AWS&lt;/u&gt;, por  ejemplo, una organización detecta y corrige una vulnerabilidad crítica en una imagen de contenedor antes de su paso a producción.&lt;/p&gt;

&lt;h2&gt;
  
  
  CloudTrail vs CloudWatch vs CloudFront
&lt;/h2&gt;

&lt;p&gt;CloudTrail, CloudWatch y CloudFront son tres servicios cuyos nombres similares pueden llevar a confusión, aunque sus propósitos son muy distintos:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CloudTrail&lt;/strong&gt; se encarga de &lt;u&gt;registrar todas las acciones realizadas en una cuenta de AWS&lt;/u&gt;, como llamadas a la API, indicando quién hizo qué, cuándo y desde dónde. Por ejemplo: registrar quién eliminó una instancia EC2 o modificó una política IAM.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CloudWatch&lt;/strong&gt; se enfoca en el &lt;u&gt;monitoreo de métricas, logs, alarmas y eventos en los recursos de AWS&lt;/u&gt;. Por ejemplo, puede generar una alerta si el uso de CPU de una instancia EC2 supera el 80%.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CloudFront&lt;/strong&gt; es un servicio de distribución de contenido (CDN) que mejora el rendimiento al entregar contenido desde ubicaciones geográficas cercanas al usuario final, mediante el almacenamiento en caché, ya sea desde buckets S3 u orígenes personalizados como servidores web.&lt;/p&gt;

&lt;h2&gt;
  
  
  AWS Site-to-Site vs AWS Direct Connect
&lt;/h2&gt;

&lt;p&gt;Ambos conceptos son formas de conectarse y acceder a los servicios de AWS en un entorno de nube híbrida.&lt;/p&gt;

&lt;p&gt;Por un lado, &lt;strong&gt;VPN (AWS Site-to-Site)&lt;/strong&gt; es un túnel cifrado que conecta una red local con una VPC (Virtual Private Cloud) &lt;u&gt;mediante internet&lt;/u&gt;, lo que implica mayor latencia e inseguridad inherente al medio.&lt;/p&gt;

&lt;p&gt;Por otro lado, &lt;strong&gt;AWS Direct Connect&lt;/strong&gt; es una conexión entre una red local y los servicios de AWS mediante un cable de &lt;u&gt;fibra óptica, es decir, sin internet&lt;/u&gt;. Especialmente útil para flujos críticos de datos por su conexión dedicada, más estable y con menor latencia.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusión
&lt;/h2&gt;

&lt;p&gt;A la hora de preparar el examen AWS Cloud Practitioner, no basta con memorizar definiciones: muchos conceptos suenan parecidos, hacen cosas diferentes o sus nombres no reflejan claramente su propósito. &lt;/p&gt;

&lt;p&gt;Personalmente, estos fueron algunos de los que más me costó diferenciar y que más fácilmente se olvidan si no se entienden a fondo.&lt;/p&gt;

&lt;p&gt;Mi recomendación es que no te limites a estudiar con tarjetas de memoria (flashcards), sino que busques entender el "para qué" de cada servicio, lo relaciones con casos de uso reales, y sobre todo, lo compares activamente con otros servicios similares. Eso ayuda no solo a aprobar el examen, sino también a aplicar ese conocimiento en proyectos reales en la nube.&lt;/p&gt;

&lt;p&gt;Si este resumen te fue útil, compártelo con quienes también estén preparando la certificación. ¡Y no dudes en comentar qué conceptos se te hicieron más difíciles!&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
