<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>压测 on heyaohua's Blog</title><link>https://blog.heyaohua.com/tags/%E5%8E%8B%E6%B5%8B/</link><description>Recent content in 压测 on heyaohua's Blog</description><image><title>heyaohua's Blog</title><url>https://blog.heyaohua.com/og-image.png</url><link>https://blog.heyaohua.com/og-image.png</link></image><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Sun, 15 Dec 2024 10:00:00 +0800</lastBuildDate><atom:link href="https://blog.heyaohua.com/tags/%E5%8E%8B%E6%B5%8B/index.xml" rel="self" type="application/rss+xml"/><item><title>MySQL与PostgreSQL全面对比与压测方案</title><link>https://blog.heyaohua.com/posts/2024/12/mysql-postgresql-comparison/</link><pubDate>Sun, 15 Dec 2024 10:00:00 +0800</pubDate><guid>https://blog.heyaohua.com/posts/2024/12/mysql-postgresql-comparison/</guid><description>MySQL与PostgreSQL全面对比分析，包括核心技术差异、性能测试、Python操作示例及压测方案。帮助开发者选择适合业务场景的数据库系统。</description><content:encoded><![CDATA[<h2 id="一mysql与postgresql对比分析">一、MySQL与PostgreSQL对比分析</h2>
<h3 id="背景与概述">背景与概述</h3>
<p>MySQL长期因轻量和高性能占市场主导，PostgreSQL凭借先进特性和稳定性近年快速崛起，尤其在云原生和复杂业务需求场景中表现出色。</p>
<h3 id="核心技术对比">核心技术对比</h3>
<table>
  <thead>
      <tr>
          <th>特性</th>
          <th>MySQL</th>
          <th>PostgreSQL</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>数据一致性</td>
          <td>MVCC，读已提交隔离，异步复制</td>
          <td>完备MVCC，默认可重复读，逻辑/流复制</td>
      </tr>
      <tr>
          <td>SQL标准兼容与扩展</td>
          <td>支持有限，扩展围绕存储引擎</td>
          <td>几乎完整支持SQL标准，支持丰富扩展</td>
      </tr>
      <tr>
          <td>性能优化</td>
          <td>读写分离，高并发读优势</td>
          <td>并行查询，分区表，分布式支持日益完善</td>
      </tr>
  </tbody>
</table>
<h3 id="postgresql使用度超mysql原因">PostgreSQL使用度超MySQL原因</h3>
<ul>
<li>业务需求提升，复杂事务、分析需求增多</li>
<li>社区活跃，插件和扩展丰富</li>
<li>云服务快速支持，官方生态发展强劲</li>
<li>大型企业和专业领域采用增多</li>
</ul>
<h3 id="未来前景">未来前景</h3>
<table>
  <thead>
      <tr>
          <th>数据库</th>
          <th>优势场景</th>
          <th>未来发展方向</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>MySQL</td>
          <td>简单高并发读写，Web应用</td>
          <td>高可用分布式，云原生集成</td>
      </tr>
      <tr>
          <td>PostgreSQL</td>
          <td>复杂事务，BI报表，地理空间</td>
          <td>原生分布式，多模扩展，SQL标准领先</td>
      </tr>
  </tbody>
</table>
<h2 id="二python数据库操作用例">二、Python数据库操作用例</h2>
<h3 id="原生驱动">原生驱动</h3>
<h4 id="mysql-pymysql">MySQL (PyMySQL)</h4>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#ff79c6">import</span> pymysql
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>conn <span style="color:#ff79c6">=</span> pymysql<span style="color:#ff79c6">.</span>connect(host<span style="color:#ff79c6">=</span><span style="color:#f1fa8c">&#39;localhost&#39;</span>, user<span style="color:#ff79c6">=</span><span style="color:#f1fa8c">&#39;user&#39;</span>, password<span style="color:#ff79c6">=</span><span style="color:#f1fa8c">&#39;password&#39;</span>, database<span style="color:#ff79c6">=</span><span style="color:#f1fa8c">&#39;testdb&#39;</span>)
</span></span><span style="display:flex;"><span>cursor <span style="color:#ff79c6">=</span> conn<span style="color:#ff79c6">.</span>cursor()
</span></span><span style="display:flex;"><span>cursor<span style="color:#ff79c6">.</span>execute(<span style="color:#f1fa8c">&#34;CREATE TABLE IF NOT EXISTS users (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100), email VARCHAR(100) UNIQUE)&#34;</span>)
</span></span><span style="display:flex;"><span>cursor<span style="color:#ff79c6">.</span>execute(<span style="color:#f1fa8c">&#34;INSERT INTO users (name, email) VALUES (</span><span style="color:#f1fa8c">%s</span><span style="color:#f1fa8c">, </span><span style="color:#f1fa8c">%s</span><span style="color:#f1fa8c">)&#34;</span>, (<span style="color:#f1fa8c">&#39;Alice&#39;</span>, <span style="color:#f1fa8c">&#39;alice@example.com&#39;</span>))
</span></span><span style="display:flex;"><span>conn<span style="color:#ff79c6">.</span>commit()
</span></span><span style="display:flex;"><span>cursor<span style="color:#ff79c6">.</span>execute(<span style="color:#f1fa8c">&#34;SELECT * FROM users&#34;</span>)
</span></span><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">print</span>(cursor<span style="color:#ff79c6">.</span>fetchall())
</span></span><span style="display:flex;"><span>cursor<span style="color:#ff79c6">.</span>close()
</span></span><span style="display:flex;"><span>conn<span style="color:#ff79c6">.</span>close()
</span></span></code></pre></div><h4 id="postgresql-psycopg2">PostgreSQL (psycopg2)</h4>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#ff79c6">import</span> psycopg2
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>conn <span style="color:#ff79c6">=</span> psycopg2<span style="color:#ff79c6">.</span>connect(host<span style="color:#ff79c6">=</span><span style="color:#f1fa8c">&#39;localhost&#39;</span>, user<span style="color:#ff79c6">=</span><span style="color:#f1fa8c">&#39;user&#39;</span>, password<span style="color:#ff79c6">=</span><span style="color:#f1fa8c">&#39;password&#39;</span>, dbname<span style="color:#ff79c6">=</span><span style="color:#f1fa8c">&#39;testdb&#39;</span>)
</span></span><span style="display:flex;"><span>cursor <span style="color:#ff79c6">=</span> conn<span style="color:#ff79c6">.</span>cursor()
</span></span><span style="display:flex;"><span>cursor<span style="color:#ff79c6">.</span>execute(<span style="color:#f1fa8c">&#34;CREATE TABLE IF NOT EXISTS users (id SERIAL PRIMARY KEY, name TEXT, email TEXT UNIQUE)&#34;</span>)
</span></span><span style="display:flex;"><span>cursor<span style="color:#ff79c6">.</span>execute(<span style="color:#f1fa8c">&#34;INSERT INTO users (name, email) VALUES (</span><span style="color:#f1fa8c">%s</span><span style="color:#f1fa8c">, </span><span style="color:#f1fa8c">%s</span><span style="color:#f1fa8c">)&#34;</span>, (<span style="color:#f1fa8c">&#39;Bob&#39;</span>, <span style="color:#f1fa8c">&#39;bob@example.com&#39;</span>))
</span></span><span style="display:flex;"><span>conn<span style="color:#ff79c6">.</span>commit()
</span></span><span style="display:flex;"><span>cursor<span style="color:#ff79c6">.</span>execute(<span style="color:#f1fa8c">&#34;SELECT * FROM users&#34;</span>)
</span></span><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">print</span>(cursor<span style="color:#ff79c6">.</span>fetchall())
</span></span><span style="display:flex;"><span>cursor<span style="color:#ff79c6">.</span>close()
</span></span><span style="display:flex;"><span>conn<span style="color:#ff79c6">.</span>close()
</span></span></code></pre></div><h3 id="orm-示例sqlalchemy">ORM 示例：SQLAlchemy</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#ff79c6">from</span> sqlalchemy <span style="color:#ff79c6">import</span> create_engine, Column, Integer, String
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">from</span> sqlalchemy.ext.declarative <span style="color:#ff79c6">import</span> declarative_base
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">from</span> sqlalchemy.orm <span style="color:#ff79c6">import</span> sessionmaker
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Base <span style="color:#ff79c6">=</span> declarative_base()
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">class</span> <span style="color:#50fa7b">User</span>(Base):
</span></span><span style="display:flex;"><span>    __tablename__ <span style="color:#ff79c6">=</span> <span style="color:#f1fa8c">&#39;users&#39;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#8be9fd;font-style:italic">id</span> <span style="color:#ff79c6">=</span> Column(Integer, primary_key<span style="color:#ff79c6">=</span><span style="color:#ff79c6">True</span>)
</span></span><span style="display:flex;"><span>    name <span style="color:#ff79c6">=</span> Column(String(<span style="color:#bd93f9">100</span>))
</span></span><span style="display:flex;"><span>    email <span style="color:#ff79c6">=</span> Column(String(<span style="color:#bd93f9">100</span>), unique<span style="color:#ff79c6">=</span><span style="color:#ff79c6">True</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>DATABASE_URL <span style="color:#ff79c6">=</span> <span style="color:#f1fa8c">&#39;postgresql+psycopg2://user:password@localhost:5432/testdb&#39;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>engine <span style="color:#ff79c6">=</span> create_engine(DATABASE_URL)
</span></span><span style="display:flex;"><span>Session <span style="color:#ff79c6">=</span> sessionmaker(bind<span style="color:#ff79c6">=</span>engine)
</span></span><span style="display:flex;"><span>session <span style="color:#ff79c6">=</span> Session()
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Base<span style="color:#ff79c6">.</span>metadata<span style="color:#ff79c6">.</span>create_all(engine)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>new_user <span style="color:#ff79c6">=</span> User(name<span style="color:#ff79c6">=</span><span style="color:#f1fa8c">&#39;Carol&#39;</span>, email<span style="color:#ff79c6">=</span><span style="color:#f1fa8c">&#39;carol@example.com&#39;</span>)
</span></span><span style="display:flex;"><span>session<span style="color:#ff79c6">.</span>add(new_user)
</span></span><span style="display:flex;"><span>session<span style="color:#ff79c6">.</span>commit()
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>users <span style="color:#ff79c6">=</span> session<span style="color:#ff79c6">.</span>query(User)<span style="color:#ff79c6">.</span>all()
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">for</span> u <span style="color:#ff79c6">in</span> users:
</span></span><span style="display:flex;"><span>    <span style="color:#8be9fd;font-style:italic">print</span>(u<span style="color:#ff79c6">.</span>id, u<span style="color:#ff79c6">.</span>name, u<span style="color:#ff79c6">.</span>email)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>session<span style="color:#ff79c6">.</span>close()
</span></span></code></pre></div><h2 id="三数据库压测方案">三、数据库压测方案</h2>
<h3 id="压测总体流程">压测总体流程</h3>
<ol>
<li>环境准备：部署数据库和测试客户端</li>
<li>场景设计：包含OLTP、高并发读写、复杂查询等</li>
<li>基线测试：默认配置性能测量</li>
<li>参数调优：调整配置重复测试</li>
<li>结果分析：整理吞吐、延迟和资源利用数据</li>
<li>自动化脚本：支持快速复用</li>
</ol>
<h3 id="主要压测工具与命令示例">主要压测工具与命令示例</h3>
<h4 id="sysbenchmysql">Sysbench（MySQL）</h4>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>sysbench oltp_read_write \
</span></span><span style="display:flex;"><span>  --db-driver=mysql \
</span></span><span style="display:flex;"><span>  --mysql-host=DB_HOST \
</span></span><span style="display:flex;"><span>  --mysql-user=testuser \
</span></span><span style="display:flex;"><span>  --mysql-password=secret \
</span></span><span style="display:flex;"><span>  --mysql-db=testdb \
</span></span><span style="display:flex;"><span>  --tables=10 \
</span></span><span style="display:flex;"><span>  --table-size=1000000 \
</span></span><span style="display:flex;"><span>  prepare
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>sysbench oltp_read_write --threads=100 --time=300 run
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>sysbench oltp_read_write cleanup
</span></span></code></pre></div><h4 id="pgbenchpostgresql">pgbench（PostgreSQL）</h4>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>pgbench -h DB_HOST -U testuser -d testdb -i -s 1000
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>pgbench -h DB_HOST -U testuser -d testdb -c 100 -T 300 -j 4
</span></span></code></pre></div><h3 id="自定义python异步压测示例">自定义Python异步压测示例</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#ff79c6">import</span> asyncio
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">import</span> aiomysql
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>DB_CONFIG <span style="color:#ff79c6">=</span> <span style="color:#8be9fd;font-style:italic">dict</span>(host<span style="color:#ff79c6">=</span><span style="color:#f1fa8c">&#39;DB_HOST&#39;</span>, user<span style="color:#ff79c6">=</span><span style="color:#f1fa8c">&#39;testuser&#39;</span>, password<span style="color:#ff79c6">=</span><span style="color:#f1fa8c">&#39;secret&#39;</span>, db<span style="color:#ff79c6">=</span><span style="color:#f1fa8c">&#39;testdb&#39;</span>, minsize<span style="color:#ff79c6">=</span><span style="color:#bd93f9">10</span>, maxsize<span style="color:#ff79c6">=</span><span style="color:#bd93f9">100</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">async</span> <span style="color:#ff79c6">def</span> <span style="color:#50fa7b">task</span>(pool):
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">async</span> <span style="color:#ff79c6">with</span> pool<span style="color:#ff79c6">.</span>acquire() <span style="color:#ff79c6">as</span> conn:
</span></span><span style="display:flex;"><span>        <span style="color:#ff79c6">async</span> <span style="color:#ff79c6">with</span> conn<span style="color:#ff79c6">.</span>cursor() <span style="color:#ff79c6">as</span> cur:
</span></span><span style="display:flex;"><span>            <span style="color:#ff79c6">await</span> cur<span style="color:#ff79c6">.</span>execute(<span style="color:#f1fa8c">&#34;SELECT COUNT(*) FROM orders WHERE status=&#39;pending&#39;&#34;</span>)
</span></span><span style="display:flex;"><span>            <span style="color:#ff79c6">await</span> cur<span style="color:#ff79c6">.</span>fetchone()
</span></span><span style="display:flex;"><span>            <span style="color:#ff79c6">await</span> cur<span style="color:#ff79c6">.</span>execute(<span style="color:#f1fa8c">&#34;UPDATE users SET last_login=NOW() WHERE id=</span><span style="color:#f1fa8c">%s</span><span style="color:#f1fa8c">&#34;</span>, (<span style="color:#bd93f9">1</span>,))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">async</span> <span style="color:#ff79c6">def</span> <span style="color:#50fa7b">run_load</span>(concurrency, duration):
</span></span><span style="display:flex;"><span>    pool <span style="color:#ff79c6">=</span> <span style="color:#ff79c6">await</span> aiomysql<span style="color:#ff79c6">.</span>create_pool(<span style="color:#ff79c6">**</span>DB_CONFIG)
</span></span><span style="display:flex;"><span>    end_time <span style="color:#ff79c6">=</span> asyncio<span style="color:#ff79c6">.</span>get_event_loop()<span style="color:#ff79c6">.</span>time() <span style="color:#ff79c6">+</span> duration
</span></span><span style="display:flex;"><span>    sem <span style="color:#ff79c6">=</span> asyncio<span style="color:#ff79c6">.</span>Semaphore(concurrency)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">async</span> <span style="color:#ff79c6">def</span> <span style="color:#50fa7b">worker</span>():
</span></span><span style="display:flex;"><span>        <span style="color:#ff79c6">async</span> <span style="color:#ff79c6">with</span> sem:
</span></span><span style="display:flex;"><span>            <span style="color:#ff79c6">while</span> asyncio<span style="color:#ff79c6">.</span>get_event_loop()<span style="color:#ff79c6">.</span>time() <span style="color:#ff79c6">&lt;</span> end_time:
</span></span><span style="display:flex;"><span>                <span style="color:#ff79c6">await</span> task(pool)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">await</span> asyncio<span style="color:#ff79c6">.</span>gather(<span style="color:#ff79c6">*</span>[worker() <span style="color:#ff79c6">for</span> _ <span style="color:#ff79c6">in</span> <span style="color:#8be9fd;font-style:italic">range</span>(concurrency)])
</span></span><span style="display:flex;"><span>    pool<span style="color:#ff79c6">.</span>close()
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">await</span> pool<span style="color:#ff79c6">.</span>wait_closed()
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>asyncio<span style="color:#ff79c6">.</span>run(run_load(concurrency<span style="color:#ff79c6">=</span><span style="color:#bd93f9">50</span>, duration<span style="color:#ff79c6">=</span><span style="color:#bd93f9">300</span>))
</span></span></code></pre></div><h2 id="四一体化压测脚本模板">四、一体化压测脚本模板</h2>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-php" data-lang="php"><span style="display:flex;"><span><span style="color:#6272a4">#!/bin/bash
</span></span></span><span style="display:flex;"><span>DB_TYPE<span style="color:#ff79c6">=</span>${<span style="color:#bd93f9">1</span><span style="color:#ff79c6">:-</span>mysql}
</span></span><span style="display:flex;"><span>DB_HOST<span style="color:#ff79c6">=</span><span style="color:#f1fa8c">&#34;127.0.0.1&#34;</span>
</span></span><span style="display:flex;"><span>DB_PORT_MYSQL<span style="color:#ff79c6">=</span><span style="color:#bd93f9">3306</span>
</span></span><span style="display:flex;"><span>DB_PORT_PG<span style="color:#ff79c6">=</span><span style="color:#bd93f9">5432</span>
</span></span><span style="display:flex;"><span>DB_USER<span style="color:#ff79c6">=</span><span style="color:#f1fa8c">&#34;testuser&#34;</span>
</span></span><span style="display:flex;"><span>DB_PASS<span style="color:#ff79c6">=</span><span style="color:#f1fa8c">&#34;secret&#34;</span>
</span></span><span style="display:flex;"><span>DB_NAME<span style="color:#ff79c6">=</span><span style="color:#f1fa8c">&#34;testdb&#34;</span>
</span></span><span style="display:flex;"><span>CONCURRENCY<span style="color:#ff79c6">=</span>(<span style="color:#bd93f9">10</span> <span style="color:#bd93f9">50</span> <span style="color:#bd93f9">100</span>)
</span></span><span style="display:flex;"><span>DURATION<span style="color:#ff79c6">=</span><span style="color:#bd93f9">120</span>
</span></span><span style="display:flex;"><span>SCALE<span style="color:#ff79c6">=</span><span style="color:#bd93f9">100</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">function</span> <span style="color:#50fa7b">bench_mysql</span>() {
</span></span><span style="display:flex;"><span>    sysbench oltp_read_write \
</span></span><span style="display:flex;"><span>        <span style="color:#ff79c6">--</span>threads<span style="color:#ff79c6">=</span>$<span style="color:#bd93f9">1</span> \
</span></span><span style="display:flex;"><span>        <span style="color:#ff79c6">--</span>time<span style="color:#ff79c6">=</span><span style="color:#8be9fd;font-style:italic">$DURATION</span> \
</span></span><span style="display:flex;"><span>        <span style="color:#ff79c6">--</span>db<span style="color:#ff79c6">-</span>driver<span style="color:#ff79c6">=</span>mysql \
</span></span><span style="display:flex;"><span>        <span style="color:#ff79c6">--</span>mysql<span style="color:#ff79c6">-</span>host<span style="color:#ff79c6">=</span><span style="color:#8be9fd;font-style:italic">$DB_HOST</span> \
</span></span><span style="display:flex;"><span>        <span style="color:#ff79c6">--</span>mysql<span style="color:#ff79c6">-</span>port<span style="color:#ff79c6">=</span><span style="color:#8be9fd;font-style:italic">$DB_PORT_MYSQL</span> \
</span></span><span style="display:flex;"><span>        <span style="color:#ff79c6">--</span>mysql<span style="color:#ff79c6">-</span>user<span style="color:#ff79c6">=</span><span style="color:#8be9fd;font-style:italic">$DB_USER</span> \
</span></span><span style="display:flex;"><span>        <span style="color:#ff79c6">--</span>mysql<span style="color:#ff79c6">-</span>password<span style="color:#ff79c6">=</span><span style="color:#8be9fd;font-style:italic">$DB_PASS</span> \
</span></span><span style="display:flex;"><span>        <span style="color:#ff79c6">--</span>mysql<span style="color:#ff79c6">-</span>db<span style="color:#ff79c6">=</span><span style="color:#8be9fd;font-style:italic">$DB_NAME</span> run <span style="color:#ff79c6">|</span> tee mysql_${<span style="color:#bd93f9">1</span>}c<span style="color:#ff79c6">.</span>log
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">function</span> <span style="color:#50fa7b">bench_pgsql</span>() {
</span></span><span style="display:flex;"><span>    pgbench <span style="color:#ff79c6">-</span>h <span style="color:#8be9fd;font-style:italic">$DB_HOST</span> <span style="color:#ff79c6">-</span>p <span style="color:#8be9fd;font-style:italic">$DB_PORT_PG</span> <span style="color:#ff79c6">-</span>U <span style="color:#8be9fd;font-style:italic">$DB_USER</span> <span style="color:#ff79c6">-</span>d <span style="color:#8be9fd;font-style:italic">$DB_NAME</span> <span style="color:#ff79c6">-</span>c $<span style="color:#bd93f9">1</span> <span style="color:#ff79c6">-</span>T <span style="color:#8be9fd;font-style:italic">$DURATION</span> <span style="color:#ff79c6">-</span>j $(nproc) <span style="color:#ff79c6">|</span> tee pg_${<span style="color:#bd93f9">1</span>}c<span style="color:#ff79c6">.</span>log
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">if</span> [[ <span style="color:#8be9fd;font-style:italic">$DB_TYPE</span> <span style="color:#ff79c6">==</span> <span style="color:#f1fa8c">&#34;pgsql&#34;</span> ]]; then
</span></span><span style="display:flex;"><span>    pgbench <span style="color:#ff79c6">-</span>h <span style="color:#8be9fd;font-style:italic">$DB_HOST</span> <span style="color:#ff79c6">-</span>p <span style="color:#8be9fd;font-style:italic">$DB_PORT_PG</span> <span style="color:#ff79c6">-</span>U <span style="color:#8be9fd;font-style:italic">$DB_USER</span> <span style="color:#ff79c6">-</span>d <span style="color:#8be9fd;font-style:italic">$DB_NAME</span> <span style="color:#ff79c6">-</span>i <span style="color:#ff79c6">-</span>s <span style="color:#8be9fd;font-style:italic">$SCALE</span>
</span></span><span style="display:flex;"><span>fi
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">for</span> c in <span style="color:#f1fa8c">&#34;</span><span style="color:#f1fa8c">${</span><span style="color:#8be9fd;font-style:italic">CONCURRENCY[@]</span><span style="color:#f1fa8c">}</span><span style="color:#f1fa8c">&#34;</span>; <span style="color:#ff79c6">do</span>
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">if</span> [[ <span style="color:#8be9fd;font-style:italic">$DB_TYPE</span> <span style="color:#ff79c6">==</span> <span style="color:#f1fa8c">&#34;mysql&#34;</span> ]]; then
</span></span><span style="display:flex;"><span>        bench_mysql <span style="color:#8be9fd;font-style:italic">$c</span>
</span></span><span style="display:flex;"><span>    <span style="color:#ff79c6">else</span>
</span></span><span style="display:flex;"><span>        bench_pgsql <span style="color:#8be9fd;font-style:italic">$c</span>
</span></span><span style="display:flex;"><span>    fi
</span></span><span style="display:flex;"><span>done
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#ff79c6">echo</span> <span style="color:#f1fa8c">&#34;压测完成，查看 *_c.log 文件&#34;</span>
</span></span></code></pre></div><h2 id="五压测结果分析与扩展建议">五、压测结果分析与扩展建议</h2>
<ul>
<li>提取日志中的TPS、延迟等数据，生成CSV</li>
<li>使用图表工具（Excel，Grafana，Matplotlib）绘制性能曲线</li>
<li>根据业务需求调整读写比、复杂查询和分布式架构测试</li>
<li>可集成监控系统，实现实时资源指标采样</li>
</ul>
<p>以上内容系统梳理了MySQL与PostgreSQL的技术对比，Python数据库操作示例，以及一整套可执行的数据库压测方案与脚本，便于用户快速搭建测试环境，评估性能，指导优化与选型。</p>
]]></content:encoded></item></channel></rss>