<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>DuckDB - Go语言中的OLAP利器</title>
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@300;400;700;900&family=Fira+Code:wght@400;600&display=swap" rel="stylesheet">
<style>
:root {
--primary-color: #00E5FF; /* Cyan Accent */
--secondary-color: #FF4081; /* Pink Accent */
--bg-dark: #0F172A; /* Deep Dark Blue */
--bg-card: #1E293B;
--text-light: #F8FAFC;
--text-dim: #94A3B8;
--code-bg: #0F172A;
--success: #4CAF50;
--warning: #FFC107;
}
body {
margin: 0;
padding: 0;
font-family: 'Noto Sans SC', sans-serif;
background-color: var(--bg-dark);
color: var(--text-light);
display: flex;
justify-content: center;
-webkit-font-smoothing: antialiased;
}
.poster-container {
width: 800px;
min-height: 1200px;
background: linear-gradient(180deg, #0F172A 0%, #0B1120 100%);
position: relative;
overflow: hidden;
display: flex;
flex-direction: column;
}
/* Decorative Background Elements */
.bg-circle {
position: absolute;
border-radius: 50%;
filter: blur(80px);
opacity: 0.15;
z-index: 0;
}
.bg-c-1 { width: 400px; height: 400px; background: var(--primary-color); top: -100px; right: -100px; }
.bg-c-2 { width: 300px; height: 300px; background: var(--secondary-color); bottom: 200px; left: -100px; }
.grid-overlay {
position: absolute;
top: 0; left: 0; right: 0; bottom: 0;
background-image: radial-gradient(rgba(255, 255, 255, 0.1) 1px, transparent 1px);
background-size: 40px 40px;
opacity: 0.2;
z-index: 0;
}
/* Header */
header {
padding: 60px 50px 40px;
z-index: 1;
text-align: center;
border-bottom: 1px solid rgba(255,255,255,0.1);
}
.logo-area {
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 20px;
}
.duck-icon {
font-size: 64px;
color: var(--warning);
margin-right: 15px;
text-shadow: 0 0 20px rgba(255, 193, 7, 0.4);
}
h1 {
font-size: 64px;
font-weight: 900;
margin: 0;
line-height: 1.1;
background: linear-gradient(90deg, #FFFFFF, #90CAF9);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
letter-spacing: -2px;
}
h2 {
font-size: 28px;
font-weight: 400;
margin: 15px 0 0;
color: var(--primary-color);
letter-spacing: 2px;
text-transform: uppercase;
}
/* Content Sections */
.content {
flex: 1;
padding: 40px 50px;
z-index: 1;
display: flex;
flex-direction: column;
gap: 40px;
}
/* Comparison Section */
.section-title {
font-size: 24px;
font-weight: 700;
margin-bottom: 20px;
display: flex;
align-items: center;
color: var(--text-light);
}
.section-title i {
margin-right: 10px;
color: var(--primary-color);
}
.comparison-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 20px;
}
.card {
background: var(--bg-card);
border-radius: 16px;
padding: 24px;
border: 1px solid rgba(255,255,255,0.05);
position: relative;
overflow: hidden;
}
.card::before {
content: '';
position: absolute;
top: 0; left: 0; width: 4px; height: 100%;
}
.card-bad::before { background: #EF4444; }
.card-good::before { background: var(--success); }
.card-highlight {
grid-column: 1 / -1;
background: linear-gradient(135deg, rgba(0, 229, 255, 0.1) 0%, rgba(30, 41, 59, 0.8) 100%);
border: 1px solid rgba(0, 229, 255, 0.3);
}
.card-highlight::before { background: var(--primary-color); }
.card h3 {
margin: 0 0 10px;
font-size: 20px;
color: var(--text-light);
}
.card p {
margin: 0;
font-size: 15px;
color: var(--text-dim);
line-height: 1.5;
}
.card-icon {
position: absolute;
top: 20px;
right: 20px;
opacity: 0.1;
font-size: 40px;
}
/* Performance Stats */
.stats-container {
display: flex;
justify-content: space-between;
background: rgba(15, 23, 42, 0.6);
border-radius: 20px;
padding: 30px;
border: 1px solid rgba(255,255,255,0.1);
margin-top: 10px;
}
.stat-item {
text-align: center;
flex: 1;
border-right: 1px solid rgba(255,255,255,0.1);
}
.stat-item:last-child { border-right: none; }
.stat-value {
font-size: 42px;
font-weight: 900;
color: var(--primary-color);
font-family: 'Fira Code', monospace;
display: block;
}
.stat-label {
font-size: 14px;
color: var(--text-dim);
margin-top: 5px;
text-transform: uppercase;
letter-spacing: 1px;
}
/* Code Block */
.code-window {
background: #000000;
border-radius: 12px;
overflow: hidden;
box-shadow: 0 20px 40px rgba(0,0,0,0.3);
border: 1px solid #333;
font-family: 'Fira Code', monospace;
}
.window-header {
background: #1E1E1E;
padding: 10px 15px;
display: flex;
gap: 8px;
border-bottom: 1px solid #333;
}
.dot { width: 12px; height: 12px; border-radius: 50%; }
.dot-red { background: #FF5F56; }
.dot-yellow { background: #FFBD2E; }
.dot-green { background: #27C93F; }
.code-content {
padding: 20px;
font-size: 14px;
line-height: 1.6;
color: #D4D4D4;
overflow-x: auto;
}
.code-comment { color: #6A9955; }
.code-func { color: #DCDCAA; }
.code-string { color: #CE9178; }
.code-keyword { color: #569CD6; }
.code-type { color: #4EC9B0; }
/* Architecture Formula */
.formula-box {
background: #1E293B;
border-radius: 16px;
padding: 25px;
text-align: center;
border: 1px dashed rgba(255,255,255,0.3);
}
.formula-text {
font-size: 20px;
font-weight: 700;
color: var(--text-light);
font-family: 'Fira Code', monospace;
}
.formula-part { color: var(--primary-color); }
.formula-plus { color: var(--text-dim); margin: 0 10px; }
/* Footer */
footer {
padding: 30px 50px;
background: rgba(0,0,0,0.2);
text-align: center;
z-index: 1;
border-top: 1px solid rgba(255,255,255,0.05);
}
.footer-info {
font-size: 14px;
color: var(--text-dim);
display: flex;
justify-content: center;
align-items: center;
gap: 10px;
}
.tag {
background: rgba(255,255,255,0.1);
padding: 4px 10px;
border-radius: 4px;
font-size: 12px;
}
/* Utility */
.highlight-text {
color: var(--primary-color);
font-weight: bold;
}
.flex-center { display: flex; align-items: center; }
</style>
</head>
<body>
<div class="poster-container">
<div class="bg-circle bg-c-1"></div>
<div class="bg-circle bg-c-2"></div>
<div class="grid-overlay"></div>
<header>
<div class="logo-area">
<i class="material-icons duck-icon">storage</i>
<div style="text-align:left;">
<h1>DuckDB</h1>
<div style="height: 4px; width: 60px; background: var(--primary-color); margin-top: 10px; border-radius: 2px;"></div>
</div>
</div>
<h2>Go语言中的OLAP利器</h2>
<p style="color: var(--text-dim); margin-top: 15px; font-size: 18px;">单二进制文件中的大数据分析引擎</p>
</header>
<div class="content">
<!-- Section 1: The Pain Point -->
<div>
<div class="section-title">
<i class="material-icons">psychology_alt</i>
开发者的困境
</div>
<div class="comparison-grid">
<div class="card card-bad">
<i class="material-icons card-icon">dns</i>
<h3>MySQL / PG</h3>
<p>行式存储分析慢<br>CPU 飙升 100%<br><span style="color: #EF4444;">❌ 不适合重分析</span></p>
</div>
<div class="card card-bad">
<i class="material-icons card-icon">cloud_queue</i>
<h3>ClickHouse / ES</h3>
<p>运维成本上天<br>架构过于复杂<br><span style="color: #EF4444;">❌ 杀鸡用牛刀</span></p>
</div>
<div class="card card-highlight">
<i class="material-icons card-icon" style="color: var(--primary-color);">bolt</i>
<h3 style="color: var(--primary-color);">DuckDB</h3>
<p style="font-size: 17px;">OLAP 界的 SQLite。<br>嵌入式、零依赖、列式存储。<br>在 Go 二进制文件中塞进一个分析引擎。</p>
</div>
</div>
</div>
<!-- Section 2: Performance -->
<div>
<div class="section-title">
<i class="material-icons">speed</i>
极致性能表现
</div>
<p style="color: var(--text-dim); margin-bottom: 15px; font-size: 14px;">基于 MacBook Pro M3 Max 实测数据</p>
<div class="stats-container">
<div class="stat-item">
<span class="stat-value">18M+</span>
<span class="stat-label">写入/秒</span>
</div>
<div class="stat-item">
<span class="stat-value"><0.5ms</span>
<span class="stat-label">写入延迟</span>
</div>
<div class="stat-item">
<span class="stat-value">6M+</span>
<span class="stat-label">扫描/秒</span>
</div>
</div>
</div>
<!-- Section 3: The Secret Sauce -->
<div>
<div class="section-title">
<i class="material-icons">code</i>
核心武器:Appender API
</div>
<p style="color: var(--text-dim); margin-bottom: 10px; font-size: 14px;">绕过 SQL 解析器,直接写入列存结构,比传统 INSERT 快 100 倍。</p>
<div class="code-window">
<div class="window-header">
<div class="dot dot-red"></div>
<div class="dot dot-yellow"></div>
<div class="dot dot-green"></div>
</div>
<div class="code-content">
<span class="code-comment">// 初始化 Appender,直接绑定底层连接</span>
<span class="code-keyword">appender</span>, err := duckdb.<span class="code-func">NewAppenderFromConn</span>(conn, "", "metrics")
<span class="code-keyword">for</span> i := <span class="code-type">0</span>; i < <span class="code-type">100000</span>; i++ {
<span class="code-comment">// 零解析开销,极速灌入数据</span>
appender.<span class="code-func">AppendRow</span>(
<span class="code-type">int32</span>(i),
<span class="code-string">"metric_name"</span>,
<span class="code-type">float64</span>(i),
time.<span class="code-func">Now</span>(),
)
}
<span class="code-comment">// 吞吐量轻松突破百万级/秒</span>
</div>
</div>
</div>
<!-- Section 4: Architecture -->
<div>
<div class="section-title">
<i class="material-icons">architecture</i>
最佳实践架构
</div>
<div class="formula-box">
<div class="formula-text">
<span style="color: var(--text-dim);">PostgreSQL</span>
<span class="formula-plus">+</span>
<span class="formula-part">Go + DuckDB</span>
</div>
<div style="margin-top: 15px; color: var(--text-dim); font-size: 14px;">
核心业务流 (OLTP) + 旁路日志分析 (OLAP)
</div>
</div>
</div>
</div>
<footer>
<div class="footer-info">
<span class="tag">Tony Bai</span>
<span>•</span>
<span class="tag">AI 智能体时代的软件工程</span>
<span>•</span>
<span class="tag">高性能数据库</span>
</div>
</footer>
</div>
</body>
</html>
登录后可参与表态
讨论回复
0 条回复还没有人回复,快来发表你的看法吧!