<?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>Forem: Hasan</title>
    <description>The latest articles on Forem by Hasan (@hasan_c4570ac043fb5681a4b).</description>
    <link>https://forem.com/hasan_c4570ac043fb5681a4b</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%2F3074834%2F9d1241ae-8818-41e0-9110-e6babac9a2c7.jpg</url>
      <title>Forem: Hasan</title>
      <link>https://forem.com/hasan_c4570ac043fb5681a4b</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/hasan_c4570ac043fb5681a4b"/>
    <language>en</language>
    <item>
      <title>Who Writes Faster: Mongo or Postgres? I Ran a 1M Record Experiment to Find Out</title>
      <dc:creator>Hasan</dc:creator>
      <pubDate>Tue, 22 Apr 2025 10:25:21 +0000</pubDate>
      <link>https://forem.com/hasan_c4570ac043fb5681a4b/who-writes-faster-mongo-or-postgres-i-ran-a-1m-record-experiment-to-find-out-2f1k</link>
      <guid>https://forem.com/hasan_c4570ac043fb5681a4b/who-writes-faster-mongo-or-postgres-i-ran-a-1m-record-experiment-to-find-out-2f1k</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;🚀 I wanted to know: &lt;strong&gt;Which database inserts 1M records faster—MongoDB or PostgreSQL?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
So I built a benchmark pipeline from scratch—and the results surprised me.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  💡 Why I Built This
&lt;/h2&gt;

&lt;p&gt;I've always loved both Mongo and Postgres. But when it comes to high-volume writes...&lt;/p&gt;

&lt;p&gt;💭 Which one &lt;em&gt;actually&lt;/em&gt; performs better?&lt;/p&gt;

&lt;p&gt;To find out, I created a controlled benchmark:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Installed both on &lt;strong&gt;Docker locally&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Used &lt;strong&gt;realistic e-commerce data&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Ran &lt;strong&gt;single&lt;/strong&gt;, &lt;strong&gt;batch&lt;/strong&gt;, and &lt;strong&gt;concurrent&lt;/strong&gt; insert tests&lt;/li&gt;
&lt;li&gt;Collected performance data: insert speed, CPU, memory&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧪 Step 1: Generate Realistic Data
&lt;/h2&gt;

&lt;p&gt;I used Python + Faker to simulate real-world e-commerce activity:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;50,000 &lt;strong&gt;customers&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;50,000 &lt;strong&gt;products&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;900,000 &lt;strong&gt;orders&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each record includes nested objects, timestamps, and varied fields. Think: preferences, inventory, shipping, JSON blobs.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python data_generator.py &lt;span class="nt"&gt;--customers&lt;/span&gt; 50000 &lt;span class="nt"&gt;--products&lt;/span&gt; 50000 &lt;span class="nt"&gt;--orders&lt;/span&gt; 900000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🛠️ Step 2: Run the Benchmark
&lt;/h2&gt;

&lt;p&gt;I tested 3 insertion styles for both Mongo and Postgres:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Single inserts&lt;/strong&gt; – one record at a time
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Batch inserts&lt;/strong&gt; – 100 to 10,000 records per operation
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Concurrent inserts&lt;/strong&gt; – up to 8 threads with batching&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Metrics collected:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🕐 Elapsed time&lt;/li&gt;
&lt;li&gt;🔁 Records per second&lt;/li&gt;
&lt;li&gt;🧠 CPU usage&lt;/li&gt;
&lt;li&gt;📦 Memory usage&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⚔️ What I Found
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🚀 Overall Performance
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Database&lt;/th&gt;
&lt;th&gt;Avg Throughput (records/sec)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;MongoDB&lt;/td&gt;
&lt;td&gt;46,012&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PostgreSQL&lt;/td&gt;
&lt;td&gt;8,900&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;MongoDB was &lt;strong&gt;5.17x faster&lt;/strong&gt; on average.&lt;/p&gt;




&lt;h3&gt;
  
  
  📦 Batch Inserts (Customers)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F55iz27vojo95br236yap.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F55iz27vojo95br236yap.png" alt="mongo vs postgresql Batch Inserts" width="800" height="312"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MongoDB peaked at &lt;strong&gt;78K/sec&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;PostgreSQL topped at &lt;strong&gt;29K/sec&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Batching unlocks massive gains for both—but Mongo scales faster.&lt;/p&gt;




&lt;h3&gt;
  
  
  🧵 Concurrent Inserts (Orders)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffz7p2jqxkjtbpopkbq6k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffz7p2jqxkjtbpopkbq6k.png" alt="mongo vs postgresql Concurrent Inserts" width="800" height="251"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MongoDB: 38K → &lt;strong&gt;110K/sec&lt;/strong&gt; (with 8 threads)&lt;/li&gt;
&lt;li&gt;PostgreSQL: 14.6K/sec (plateaus early)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mongo loves parallelism. Postgres has limits here.&lt;/p&gt;




&lt;h3&gt;
  
  
  🔍 Single Inserts
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcz7qtxui8d0ix4l52pn7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcz7qtxui8d0ix4l52pn7.png" alt="mongo vs postgresql Single Inserts" width="800" height="123"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PostgreSQL wins&lt;/strong&gt; in single insert performance
&lt;/li&gt;
&lt;li&gt;Its row-level optimization outperforms Mongo’s write path&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  ⚙️ Resource Usage
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffcn6fahpnul4b8nrxqkc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffcn6fahpnul4b8nrxqkc.png" alt="mongo vs postgresql Resource Usage" width="800" height="186"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Postgres used less CPU &amp;amp; memory overall&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Mongo burned hotter under concurrency&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧠 TL;DR: Who Wins?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Winner&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🏎️ Overall Speed&lt;/td&gt;
&lt;td&gt;MongoDB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🎯 Single Inserts&lt;/td&gt;
&lt;td&gt;PostgreSQL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📦 Batch Scaling&lt;/td&gt;
&lt;td&gt;MongoDB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🧵 Concurrency Scaling&lt;/td&gt;
&lt;td&gt;MongoDB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;💡 Resource Efficiency&lt;/td&gt;
&lt;td&gt;PostgreSQL&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;🔧 If you need &lt;em&gt;blazing speed&lt;/em&gt;, go MongoDB.&lt;br&gt;&lt;br&gt;
🛡️ If you need &lt;em&gt;strict schema &amp;amp; efficiency&lt;/em&gt;, go PostgreSQL.&lt;/p&gt;


&lt;h2&gt;
  
  
  🧪 Try It Yourself (GitHub Repo)
&lt;/h2&gt;

&lt;p&gt;Want to run your own tests?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Clone the project&lt;/span&gt;
git clone https://github.com/hassancs91/mongo-vs-postgres
&lt;span class="nb"&gt;cd &lt;/span&gt;mongo-vs-postgres-benchmark

&lt;span class="c"&gt;# Start databases&lt;/span&gt;
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; mongo &lt;span class="nt"&gt;-p&lt;/span&gt; 27017:27017 mongo
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; postgres &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;POSTGRES_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;postgres &lt;span class="nt"&gt;-p&lt;/span&gt; 5432:5432 postgres

&lt;span class="c"&gt;# Generate data&lt;/span&gt;
python data_generator.py &lt;span class="nt"&gt;--customers&lt;/span&gt; 50000 &lt;span class="nt"&gt;--products&lt;/span&gt; 50000 &lt;span class="nt"&gt;--orders&lt;/span&gt; 900000

&lt;span class="c"&gt;# Run benchmarks&lt;/span&gt;
python benchmark.py &lt;span class="nt"&gt;--data-dir&lt;/span&gt; data &lt;span class="nt"&gt;--output-dir&lt;/span&gt; results &lt;span class="nt"&gt;--postgres-host&lt;/span&gt; localhost ...

&lt;span class="c"&gt;# Generate report&lt;/span&gt;
python report_generator.py &lt;span class="nt"&gt;--results-dir&lt;/span&gt; results &lt;span class="nt"&gt;--output-file&lt;/span&gt; results/case_study_report.md &lt;span class="nt"&gt;--charts-dir&lt;/span&gt; results
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📁 You’ll get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JSON results&lt;/li&gt;
&lt;li&gt;PNG charts&lt;/li&gt;
&lt;li&gt;Full Markdown report&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔭 What I'm Testing Next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Complex query performance (joins, aggregations)&lt;/li&gt;
&lt;li&gt;Updates and deletes&lt;/li&gt;
&lt;li&gt;Mixed workloads (read + write)&lt;/li&gt;
&lt;li&gt;10M+ record datasets&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💬 Let’s Talk
&lt;/h2&gt;

&lt;p&gt;Which database has performed better for you in real-world write-heavy apps?&lt;br&gt;&lt;br&gt;
Have you ever hit a scaling wall with one of them?&lt;/p&gt;

&lt;p&gt;I'd love to hear your stories 👇&lt;/p&gt;




&lt;p&gt;📥 Full report + visuals + code:&lt;br&gt;&lt;br&gt;
👉 &lt;a href="https://github.com/hassancs91/mongo-vs-postgres" rel="noopener noreferrer"&gt;https://github.com/hassancs91/mongo-vs-postgres&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;🧑‍💻 Happy benchmarking!&lt;/p&gt;

</description>
      <category>mongodb</category>
      <category>postgres</category>
      <category>testing</category>
      <category>python</category>
    </item>
  </channel>
</rss>
