穿越牛熊的“金融诺亚方舟”:永久投资组合全解析

你说这个世界上是否存在一种投资方法,永赚不亏? 无数人一直孜孜不倦的寻求的交易圣杯是否存在? 今天就介绍一种接近完美的投资方法,永久投资组合!它可以穿越牛熊,虽然收益率不高,但通过最近五十年数据回测,即使2008年大熊市,亏损也没超过1个点,只有不到5年亏损,45年盈利! ——用25%×4的极简配置,打造全天候财富堡垒 1987年美股崩盘日,道指单日暴跌22.6%,而一个持有股票+债券+黄金+现金的账户仅回撤1.3% 一、什么是永久投资组合?核心理念解析 创始人哈利·布朗(Harry Browne)的终极洞察: “没有人能准确预判经济周期,但所有市场只存在四种状态:繁荣、衰退、通缩、通胀。” 基于此,他提出用四类完全负相关的资产构建组合: graph LR A[经济繁荣] --> B(股票↑) C[经济衰退] --> D(债券↑) E[通货紧缩] --> F(现金↑) G[通货膨胀] --> H(黄金↑) 二、经典配置:25%×4的黄金比例 资产类别 代表标的 核心作用 历史年化收益 股票 标普500/沪深300指数基金 获取长期增长 6-10% 长期国债 20年+国债ETF 对冲衰退,利率下行时暴涨 3-5% 黄金 实物金条/黄金ETF 抗通胀+避险 2-4% 现金 短期国库券/货币基金 提供流动性+抗通缩 1-3% 注:数据基于1972-2023年回溯测试,组合年化收益约6.1%,最大回撤≤15% 三、永久组合三大超能力实测 1. 抗暴跌能力(1987-2025关键危机表现) 事件 美股跌幅 永久组合涨跌 1987年黑色星期一 -22.6% -1.3% 2008年金融危机 -38.5% -5.7% 2020年新冠熔断 -33.9% -3.2% 2025年9月联储转向 -11.2% +0.8% 2. 通胀通缩双杀防御 1973年石油危机(通胀13.3%):黄金暴涨72%抵消股票亏损 2008年通缩危机:国债上涨28%+现金保值 3. 极简维护 每年只需1次再平衡(阈值±15%),管理成本<0.2% 四、实战操作指南(2025新版) ▶ 建仓步骤 分配资金:将投资本金均分4份 选择标的(A股投资者示例): 股票:沪深300ETF(510300) 债券:30年国债ETF(511090) 黄金:黄金ETF(518880) 现金:华宝添益(511990) 买入规则: 一次性投入:适合存量资金 分批定投:每月补仓低位资产 ▶ 再平衡策略 flowchart TB A[每年12月检查仓位] --> B{单一资产涨跌幅>15%?} B -->|是| C[卖出超标资产\n买入不足资产] B -->|否| D[不做操作] C --> E[恢复25%比例] 五、2025年特殊环境下的调优建议 当前经济处于**“滞胀+降息”** 叠加态: 微调现金比例:美联储降息周期中货币基金收益下降,可将现金占比降至20%,国债增至30% 黄金战略增持:地缘冲突+去美元化加速,黄金配置上限可提至30% 警惕债券波动:长期国债利率已处低位(美债3.8%),改用7-10年国债ETF降低久期风险 六、谁最适合永久组合? 投资者类型 适配度 原因 厌恶本金损失者 ★★★★★ 历史最大回撤<15% 退休资产配置 ★★★★☆ 稳定现金流+低波动 小白投资者 ★★★★☆ 无需择时,操作简单 追求高收益者 ★★☆☆☆ 长期年化收益仅6-8% 终极启示:用“不折腾”战胜90%的投资者 1987年投入10万美元的永久组合,2025年价值210万美元—— 这艘“金融诺亚方舟”的伟大之处,不在于暴利,而在于: 用机械般的纪律取代人性弱点,用资产负相关对冲未知风险,用最朴素的配置实现财富的永续传承。 “复杂的终点是简约,喧嚣的尽头是平静。” —— 哈利·布朗《万全之策》 附赠 散户炒股最佳策略: 重仓优质股长期持有 等每年的股灾再出手 只存定期,不炒股! 参考&致谢 系列教程 全部文章RSS订阅 社会经济系列 生活中的那些有趣的不可能三角介绍与解析 关于经济观察,投资理财以及未来经济展望 穿越牛熊的“金融诺亚方舟”:永久投资组合全解析

2025/12/5
articleCard.readMore

内网域名管理+DNS加速+DNS去广告+魔法上网的终极系统

最近使用openWRT实现了一套几乎终极效果的内网域名管理+DNS加速+DNS去广告+魔法上网的系统,极致的复杂配置之后,就是最简单的无感使用方式。本文将讲述其构架和实现细节,现在任何人都可以无需任何配置就可以直接域名访问 nas 中部署的内网各种服务,加访问 google openai 等服务。 TIPS: 本文不是写给小白的,而是给懂技术的用户的。可能不会说的很细,但能看懂的自然能看懂,看不懂的,写得再细致看了还是白看。 什么是DNS 首先让我们简单了解什么是 DNS,为什么要配置 DNS DNS 解析器(也称解析器)将域名转换为互联网上的 IP 地址。 每次您的计算机使用域名(例如example.com)连接到网站时,它都需要知道该网站的 IP 地址,即一组唯一的数字。因此,它会联系 DNS 解析器并获取网站的当前 IP 地址。 一般来说,DNS解析器是去中心化DNS系统的一部分。当你向解析器发送请求时,它会联系其他DNS服务器来获取地址。 您计算机使用的 DNS 解析器通常由您的互联网服务提供商 (ISP) 选择。如果您想为您的网络使用其他 DNS 解析器,您可以自行配置网络以启用它。您可以在操作系统的网络设置或家用路由器的管理界面中更改此配置。 DNSMasq + DNSCrypt Proxy 开胃小菜的配置 和nginx 配合使用。 简单的可以直接修改/etc/hosts。 DNSCrypt Proxy: 作为DNS前端访问DOH的DNS DNSMasq: 作为DNS后端,连接到DNSCrypt Proxy,并配置本地域名。还可以添加DNS去广告功能,浏览器插件去广告非常消耗CPU和内存,但是在DNS前端去广告,资源消耗低,并一次性解决所有的访问终端(pc,手机,平板)广告问题。 配置一个去广告,本地域名管理工具。 TIPS: 使用时需要手动设置本机dns指向nas 的 DNS dnsmasq + smartDNS 直接接管路由器下游所有设备的DNS,直接无感访问私有域名! 最推荐的使用方式!用户不需要任何配置,任何软件的安装,真正的无感使用! 整体架构图 graph LR subgraph 用户网络访问 User[用户] -->|域名访问| Router[OpenWrt路由器] end subgraph OpenWrt路由器 Router --> |DNS请求| DNSMASQ[dnsmasq] DNSMASQ -->|上游查询| SmartDNS[smartdns<br>加速/去广告] Router -->|内网访问| NAS(域名管理) SmartDNS -->|国外域名<br>DOH/DOT<br>流量代理| DNS SmartDNS -->|国外域名<br>DOH/DOT<br>流量代理| DNS... SmartDNS --> |国内域名| 国内DNS SmartDNS --> |国内域名| 国内DNS... passwall[passwall<br>透明代理] --> xray OpenWrt_Script -->|更新配置| DNSMASQ OpenWrt_Script -->|更新配置| SmartDNS end subgraph NAS服务器 NAS --> |内网域名| Nginx[Nginx<br>反向代理] Nginx --> Emby[emby服务] Nginx --> Iyuu[iyuu服务] Nginx --> Other[其他服务] Script[配置生成脚本<br>内网域名:IPv4/Ipv6] --> HTTP[HTTP配置服务] HTTP -->|提供配置| OpenWrt_Script[OpenWrt更新脚本<br>内网域名] end subgraph 外网域名 Router -->|外网域名<br>代理访问| PROXYDOMAIN[被墙域名<br>Google openAI etc] Router -->|外网域名<br>直接访问| DOMAIN[外网域名] end 关键组件说明 OpenWrt路由器: dnsmasq:本地 DNS 服务器,处理客户端 DNS 请求 smartdns:智能 DNS 解析服务,作为 dnsmasq 的上游 定期执行配置更新脚本 NAS服务器: Nginx:反向代理所有服务(emby/iyuu等) 配置生成脚本:自动获取本机 IP 并生成配置文件 HTTP 服务:提供配置文件下载 配置更新流程: NAS 脚本定期生成配置文件 OpenWrt 脚本定期拉取新配置 动态更新 DNS 服务配置 Nas 中 DNS 配置更新流程图 sequenceDiagram participant NAS_Script as NAS 配置脚本 participant HTTP_Server as HTTP 服务 participant OpenWrt_Script as OpenWrt 更新脚本 participant DNSMASQ participant SmartDNS loop 定期执行 NAS_Script->>NAS_Script: 获取本机 IPv4/IPv6 NAS_Script->>NAS_Script: 生成配置文件 Note right of NAS_Script: dnsmasq.conf<br>smartdns.conf NAS_Script->>HTTP_Server: 上传配置文件 end loop 每小时执行 OpenWrt_Script->>HTTP_Server: 请求最新配置 HTTP_Server-->>OpenWrt_Script: 返回配置文件 OpenWrt_Script->>DNSMASQ: 应用新配置 OpenWrt_Script->>SmartDNS: 应用新配置 OpenWrt_Script->>DNSMASQ: 重启服务 OpenWrt_Script->>SmartDNS: 重启服务 end 配置文件生成逻辑 flowchart TD Start[开始] --> GetIP{获取IP} GetIP --> |命令| IPv4[ip -4 addr show] GetIP --> |命令| IPv6[ip -6 addr show] IPv4 --> Parse[解析有效IP] IPv6 --> Parse Parse --> GenConfig[生成配置文件] subgraph 配置文件内容 GenConfig --> DnsmasqConf[address=/mydomain.com/NAS_IP] GenConfig --> SmartDNSConf[domain-rules /mydomain.com/ -c NAS_IP] end GenConfig --> Save[保存到HTTP目录] Save --> End[结束] 服务关系说明 组件 功能描述 dnsmasq 本地DNS缓存,将特定域名直接解析为NAS内网IP,绕过公网解析 smartdns 智能DNS解析,过滤广告/恶意域名,作为dnsmasq的上游提供纯净DNS结果 Nginx 反向代理服务,通过不同子路径转发到NAS上的不同服务(emby:8096, iyuu:8787等) 更新脚本 双端协同工作保持DNS配置与NAS实际IP同步,解决动态IP变化导致的服务中断问题 优势特点 IP动态适配:自动检测NAS的IPv4/IPv6变化,无需手动维护 DNS分层处理: pie title DNS解析分层 "dnsmasq本地解析" : 40 "smartdns智能过滤/加速" : 30 "上游DNS服务" : 30 服务高可用: 域名访问不受NAS IP变化影响 内置服务自动重启机制 安全隔离: 所有服务通过Nginx暴露 内部服务不直接暴露公网 提示:建议将OpenWrt更新脚本设置为开机启动运行一次 + 每小时(或者时间更短)执行,NAS配置脚本在系统启动和网络变化时触发,实现无缝切换。 smartDNS 配置 这个可以很简单,也可以很复杂。 个人使用了一套集成了几十个DNS分线路解析的配置,配置说明很麻烦,写起来很长。 这部分内容暂略,后期再补充。各位用户可以先简单配置,后期看我这里的更新。 后话 考虑在不触碰某条线的情况下,怎么编写本文。有兴趣的过段时间再查看本文。 参考&致谢 你应该了解的 3 种 DNS 服务器类型 系列教程 全部文章RSS订阅 图书、音乐、视频多媒体锦集 Nas RSS分类订阅 视频图书和音乐完全自动化管理框架图解 如何建立自己的私人电子图书馆–出版书籍,网络小说,漫画一网打尽! Zlibrary 图书资源下载与 Calibre 图书管理打造结构化电子图书馆高阶教程 如何使用media Go,MusicBrainz,Mp3tag工具刮削音乐 整理音乐资料库 私人在线音乐服务器搭建与使用介绍 如何使用tinyMediaManager刮削电影和电视剧,动画,并自动下载字幕 使用jeckett,sonarr,iyuu,qt,emby打造全自动追剧流程 hexo博客博文撰写篇之完美笔记大攻略终极完全版 Nas系列 Nas 分类 RSS 订阅 从零开始玩PT-入门到精通 如何建立自己的私人电子图书馆–出版书籍,网络小说,漫画一网打尽! Zlibrary 图书资源下载与 Calibre 图书管理打造结构化电子图书馆高阶教程 音视频图书和音乐自动化管理框架图解 使用jeckett,sonarr,iyuu,qt,emby打造全自动追剧流程 如何使用tinyMediaManager刮削电影和电视剧,动画,并自动下载字幕 Potplayer终极优化教程实现PC视频播放最强画质 Transmission 使用及其配置 Qbittorrent 参数详细设置教程 IPFS从零开始快速入门教程 家庭网络优化指南:提升NAT类型,降低游戏延迟、提高下载速度 内网域名管理+DNS加速+DNS去广告+魔法上网的终极系统 如何创建属于自己的私人资料库与私人搜索引擎 PT 工具集,Linux硬链接助手 QNAP 修改应用启动顺序 qnap硬盘移动位置 qnap IO 错误消除 Docker系列 Docker 分类 RSS 订阅 Docker使用简明教程 使用jeckett,sonarr,iyuu,qt,emby打造全自动追剧流程 为知笔记私有化Docker部署 Earthly 一个更加强大的镜像构建工具 使用 Shell 脚本实现一个简单 Docker 如何使用Traefik V2 在Ubuntu20.04 上面来做 Dockers 通过IPV6访问Qnap NAS中Docker的服务

2025/11/23
articleCard.readMore

PostgreSQL 实现原理深度剖析:高性能数据库引擎的核心机制

PostgreSQL 作为最先进的开源关系数据库系统,其内部实现原理体现了数据库领域的前沿设计与工程智慧。本文将深入探讨 PostgreSQL 的架构设计、存储机制、并发控制和优化器原理,并通过与 MySQL 的对比展示其独特优势。 视频:养活国内大半自研数据库团队的PostgreSQL是什么? I. PostgreSQL 整体架构 PostgreSQL 采用多进程架构 (Process-based),每个客户端连接对应一个独立的服务进程。这种设计虽然比线程模型消耗更多内存,但提供了极高的隔离性和稳定性——一个查询的崩溃绝不会拖垮整个数据库。 graph TD Client[客户端应用] -->|TCP/IP| Postmaster[Postmaster 主守护进程] subgraph "进程模型" Postmaster -->|fork| Backend1[服务进程 1: Backend] Postmaster -->|fork| Backend2[服务进程 2: Backend] Postmaster -->|fork| Backend3[服务进程 3: Backend] end subgraph "共享内存区域" SharedBuffer[Shared Buffer<br/>共享缓冲区] WALBuffer[WAL Buffer<br/>日志缓冲区] Backend1 <--> SharedBuffer Backend2 <--> SharedBuffer Backend3 <--> SharedBuffer SharedBuffer <--> WALBuffer end subgraph "关键后台进程" BgWriter[BgWriter<br/>后台写入器] Checkpointer[Checkpointer<br/>检查点进程] WALWriter[WAL Writer<br/>日志写入器] Autovacuum[Autovacuum<br/>自动清理进程] end SharedBuffer --> BgWriter WALBuffer --> WALWriter SharedBuffer --> Checkpointer SharedBuffer --> Autovacuum BgWriter -->|写入脏页| Storage[持久化存储<br/>数据文件] WALWriter -->|写入WAL| WALStorage[WAL文件] Checkpointer -->|检查点| Storage Autovacuum -->|清理| Storage 核心组件交互流程: Postmaster:主守护进程 (PID 1 of PG),负责监听端口 (5432)、管理连接请求、恢复系统。 Server Process (Backend):每个客户端连接对应一个 postgres 子进程,负责执行 SQL、排序、计算。 Shared Buffer:所有进程共享的内存池,用于缓存数据页 (Page)。Postgres 依赖 OS Cache 形成双重缓存架构。 后台进程 (Background Processes): BgWriter:将脏页 (Dirty Pages) 缓慢刷盘,减轻 Checkpoint 压力。 Checkpointer:定期执行检查点,确保数据落盘,缩短恢复时间。 WAL Writer:将 WAL Buffer 中的日志条目刷入磁盘。 Autovacuum:自动发现并清理死元组,更新统计信息。 II. 存储引擎与数据组织 PostgreSQL 的存储层设计精妙,采用 堆表 (Heap Table) 结构,并辅以多种辅助文件。 2.1 页面与元组结构 (Page & Tuple) Postgres 的标准页面大小为 8KB。 classDiagram class PageHeaderData { +uint16 pd_lower (空闲空间起始) +uint16 pd_upper (空闲空间结束) +uint16 pd_special (特殊空间起始) } class LinePointer { +uint32 IpId (行指针: 偏移量+长度) } class HeapTupleData { +uint32 t_xmin (创建事务ID) +uint32 t_xmax (删除事务ID) +ItemPointerData t_ctid (物理位置) +uint16 t_infomask (标志位/Hint Bits) +data fields[] (实际数据) } class TablePage { PageHeaderData header LinePointer[] pointers FreeSpace 空闲空间 HeapTupleData[] tuples } TablePage "1" *-- "1" PageHeaderData : 包含 TablePage "1" *-- "n" LinePointer : 从前向后生长 TablePage "1" *-- "n" HeapTupleData : 从后向前生长 关键机制: 行指针 (ItemPointer):索引不直接指向数据行,而是指向 Page 里的行指针。这使得 Page 内部进行碎片整理(移动 Tuple)时,无需修改外部索引,只需更新行指针即可。 TOAST 机制:当行大小超过页面的 1/4 (约 2KB) 时,超长字段(如 JSONB, Text)会被压缩并切片存储到专门的 TOAST 表中,主表只留一个指针。 2.2 关键辅助文件 Postgres 除了主数据文件,还维护着两个至关重要的位图文件: FSM (Free Space Map): 作用: 快速定位哪个页面有足够的空闲空间来插入新数据,避免全表扫描寻找空位。 VM (Visibility Map): 作用: 标记某个页面上的所有元组是否对“所有活跃事务”可见。 核心优化: Index-Only Scan。如果 VM 显示页面全可见,索引扫描可以直接返回数据,无需回表 (Heap Fetch)。 III. 多版本并发控制 (MVCC) PostgreSQL 的 MVCC 通过保留数据旧版本来实现,而不是像 MySQL (InnoDB) 那样使用 Undo Log 回滚段。 3.1 元组生命周期 stateDiagram-v2 [*] --> Active : INSERT (创建新行) Active --> Committed : COMMIT (事务提交) Active --> Aborted : ROLLBACK (事务回滚) Committed --> Updating : UPDATE (被新事务更新) Updating --> Dead : COMMIT (更新提交,旧行失效) Committed --> Deleting : DELETE (被新事务删除) Deleting --> Dead : COMMIT (删除提交) Dead --> Reusable : VACUUM (清理死元组) Reusable --> [*] : 空间重用 3.2 版本链与可见性 当一行数据被更新时,新旧版本通过 ctid 指针连接形成版本链。 graph TB Query[查询事务 Snapshot<br/>Xmin=250] subgraph VersionChain [元组版本链] V1["<b>版本 1</b><br/>xmin=100 (Committed)<br/>xmax=200 (Committed)"] V2["<b>版本 2</b><br/>xmin=200 (Committed)<br/>xmax=300 (Running)"] V3["<b>版本 3</b><br/>xmin=300 (Running)<br/>xmax=0"] end Query --> V1 Query --> V2 Query --> V3 V1 -->|ctid| V2 V2 -->|ctid| V3 %% 添加可见性标签 V1_Label[不可见: xmax已提交] V2_Label["<b>可见</b>: xmin已提交 & xmax未提交"] V3_Label[不可见: xmin未提交] V1 -.-> V1_Label V2 -.-> V2_Label V3 -.-> V3_Label class V2 highlight classDef highlight fill:#d5f5e3,stroke:#2ecc71,stroke-width:2px 可见性规则的核心: xmin < 当前快照 && (xmax == 0 || xmax > 当前快照) 简而言之:我只能看到在我开始之前已经提交的数据,且这些数据在我开始之前没有被删除。 IV. 查询处理与优化器 PostgreSQL 拥有极其强大的查询优化器,支持遗传算法 (GEQO) 和复杂代价模型。 4.1 查询执行流水线 sequenceDiagram participant Client participant Parser as 解析器 (Parser) participant Analyzer as 分析器 (Analyzer) participant Rewriter as 重写器 (Rewriter) participant Planner as 规划器 (Planner) participant Executor as 执行器 (Executor) Client->>Parser: 发送 SQL 查询 Parser->>Analyzer: 生成原始解析树 (Parse Tree) Analyzer->>Rewriter: 语义分析 & 生成查询树 (Query Tree) Rewriter->>Planner: 应用规则 (如视图展开) Planner->>Planner: 逻辑优化 & 物理优化 Note right of Planner: 成本估算 (CBO)<br/>遗传算法 (GEQO)<br/>连接顺序选择 Planner->>Executor: 生成最优执行计划 (Plan Tree) Executor->>Executor: 递归执行节点 (Scan/Join/Sort) Executor-->>Client: 返回结果集 4.2 优化器黑科技 遗传查询优化 (GEQO): 当连接的表数量非常多(默认 >= 12)时,穷举所有连接顺序太慢,PG 会自动切换到遗传算法来搜索近似最优解。 JIT (即时编译): 对于复杂的大型 OLAP 查询,PG 可以利用 LLVM 将 SQL 表达式动态编译为机器码,加速执行。 并行查询: 自动利用多核 CPU 并行执行扫描、连接和聚合操作。 V. 索引机制详解 PG 的索引是开放接口的,支持极其丰富的数据结构。 5.1 B-tree 索引结构 (Lehman & Yao 算法) graph TD Root[Root Node] --> I1[Internal Node] Root --> I2[Internal Node] I1 --> L1[Leaf Node 1<br/>Data: 1..10] I1 --> L2[Leaf Node 2<br/>Data: 11..20] I2 --> L3[Leaf Node 3<br/>Data: 21..30] L1 -.->|Right Link| L2 L2 -.->|Right Link| L3 classDef leaf fill:#e8f8f5,stroke:#1abc9c class L1,L2,L3 leaf Right-Link 机制: 允许读操作在节点分裂 (Split) 时无需加锁,极大提升并发性能。 5.2 索引类型全景 索引类型 原理 杀手级应用场景 B-tree 平衡树 绝大多数常规查询 (=, >, <, BETWEEN) GIN 倒排索引 (Inverted) JSONB 包含查询、数组搜索、全文检索 GiST 通用搜索树 GIS 地理数据 (PostGIS)、几何图形重叠判断 SP-GiST 空间分区树 非平衡数据集,如 URL 路由、分区数据 BRIN 块范围索引 时序数据、超大数据集的日志表 (极省空间) VI. 事务管理与 WAL 6.1 ACID 的基石:WAL sequenceDiagram participant Tx as 事务 participant WALBuf as WAL Buffer participant WALFile as 磁盘 WAL 文件 participant SharedBuf as Shared Buffer participant DataFile as 磁盘数据文件 Note over Tx, WALFile: 预写日志原则 (Write-Ahead Logging) Tx->>WALBuf: 1. 写入变更日志 (XLogRecord) Tx->>SharedBuf: 2. 修改内存中的数据页 (Dirty Page) Tx->>Tx: 3. 提交事务 (COMMIT) Tx->>WALBuf: 4. 写入 Commit Record WALBuf->>WALFile: 5. 刷盘 (fsync/fdatasync) WALFile-->>Tx: 6. 提交成功确认 Note over SharedBuf, DataFile: 此时数据页可能还没写入磁盘! loop Checkpoint / BgWriter SharedBuf->>DataFile: 7. 异步将脏页写入数据文件 end Full Page Write (全页写入): 在 Checkpoint 后,第一次修改页面会记录整个页面内容,防止 OS 崩溃导致的“半页写入”损坏。 VII. 扩展性与高级特性 7.1 强大的分区表 graph TD Parent[主表: Sales] -->|Partition Key: Date| P1[分区: Sales_Jan] Parent --> P2[分区: Sales_Feb] Parent --> P3[分区: Sales_Mar] Client[查询: WHERE date='Jan-01'] -.->|Partition Pruning| P1 Client -.->|忽略| P2 Client -.->|忽略| P3 Partition Pruning (分区剪枝): 查询优化器能自动跳过不需要扫描的分区。 7.2 物理复制 vs 逻辑复制 graph TB subgraph "物理流复制 (HA)" P1[主库] -->|WAL Stream| P2[备库] end subgraph "逻辑复制 (ETL/微服务)" L1[发布端] -->|Logical Decoding| L2[订阅端] end %% 为两个子图添加描述性文本 P_Desc[整实例复制<br/>只读副本<br/>故障切换] L_Desc[表级粒度<br/>跨版本/跨OS<br/>数据汇聚] VIII. PostgreSQL vs MySQL 核心对比 8.1 功能与理念对比 特性 PostgreSQL MySQL (InnoDB) 核心差异点 架构 多进程 多线程 PG 隔离性强,连接开销大 (需连接池);MySQL 连接轻量。 MVCC append-only (新旧版本共存) undo log (回滚段) PG 写不阻塞读,清理依赖 VACUUM;MySQL 空间回收由 Purge 线程自动处理。 Join 算法 Nested Loop, Hash Join, Merge Join 长期仅 Nested Loop (8.0+ 加入 Hash Join) PG 处理复杂多表关联性能极强 (OLAP 能力更优)。 数据类型 JSONB (二进制+索引), GIS, 数组 JSON (文本), GIS 较弱 PG 是 NoSQL + SQL 的完美结合体。 许可证 PostgreSQL (类 BSD) GPL PG 商业化更自由。 8.2 选型建议图谱 journey title 数据库选型决策路径 section 业务场景分析 简单 CRUD, 互联网高并发: 5: MySQL 复杂 SQL, 数据分析, 报表: 5: PostgreSQL 需要 GIS 地理信息: 5: PostgreSQL (PostGIS) 需要 JSON 文档存储: 4: PostgreSQL (JSONB) section 运维考量 DBA 人才储备充足: 5: MySQL 需要极致的数据一致性: 5: PostgreSQL 需要 Oracle 迁移: 4: PostgreSQL 总结 PostgreSQL 能够成为当今最流行的数据库之一,归功于其学院派的严谨与工程派的实用的完美结合: 真正的 MVCC 实现:提供无阻塞读取和严格的快照隔离。 可扩展架构:通过 Extension (如 PostGIS, TimescaleDB) 让数据库能力无限延伸。 强大的优化器:能够驾驭极其复杂的查询逻辑,不仅仅是简单的 Key-Value 查询。 专家建议:如果你的业务涉及复杂的数据模型、混合负载 (HTAP) 或地理空间数据,PostgreSQL 是不二之选;如果是纯粹的高并发简单点查询 (Point Select),MySQL 依然表现优异。 参考&致谢 系列教程 全部文章RSS订阅 数据库系列 SQL命令使用教程:从入门到精通 SQLite使用全面教程:轻量级数据库的终极指南 MySQL命令行使用全面教程:从入门到精通 MySQL 使用全面指南:从入门到高级实践 PostgreSQL 使用全面指南:从入门到企业级应用 PostgreSQL命令行使用教程:掌握 psql 工具 PostgreSQL 实现原理深度剖析:高性能数据库引擎的核心机制

2025/11/22
articleCard.readMore

PostgreSQL 使用全面指南:从入门到企业级应用

PostgreSQL 是世界上最先进的开源关系型数据库,以其强大的功能、高度的扩展性和严格的SQL标准兼容性著称。本教程将带你从基础到高级全面掌握PostgreSQL的使用技巧,涵盖安装配置、核心操作、高级特性和性能优化等各个方面。 一、PostgreSQL概述 PostgreSQL(常简称为Postgres)是一个功能强大的开源对象关系数据库系统,具有以下核心特点: 高度符合SQL标准:支持SQL:2016标准的绝大部分功能 可扩展性:支持自定义数据类型、函数、操作符和索引方法 ACID兼容:完全支持事务处理 丰富的特性: 复杂查询 外键 触发器 可更新的视图 事务完整性 多版本并发控制(MVCC) 多语言支持:PL/pgSQL、PL/Python、PL/Perl、PL/Tcl等 强大的扩展:PostGIS(地理空间)、pgRouting(路径规划)、TimescaleDB(时序数据)等 graph TD PostgreSQL --> 核心功能[核心功能] PostgreSQL --> 扩展模块[扩展模块] 核心功能 --> SQL标准 核心功能 --> ACID事务 核心功能 --> MVCC 核心功能 --> 复杂索引 扩展模块 --> PostGIS 扩展模块 --> TimescaleDB 扩展模块 --> pg_partman 扩展模块 --> PL/Python 二、安装与配置 不同平台安装 # Ubuntu/Debian sudo apt update sudo apt install postgresql postgresql-contrib # CentOS/RHEL sudo yum install postgresql-server postgresql-contrib sudo postgresql-setup --initdb # macOS (Homebrew) brew install postgresql brew services start postgresql # Windows 下载安装包:https://www.postgresql.org/download/windows/ 基本配置 初始化数据库集群 sudo -u postgres initdb -D /var/lib/postgres/data 启动服务 sudo systemctl start postgresql sudo systemctl enable postgresql 配置访问权限 pg_hba.conf: # 允许本地所有连接 localallalltrust # 允许网络连接 hostallall0.0.0.0/0md5 修改监听地址 postgresql.conf: listen_addresses = '*' 创建用户和数据库 -- 连接PostgreSQL sudo -u postgres psql -- 创建用户 CREATE USER myuser WITH PASSWORD 'securepassword'; -- 创建数据库 CREATE DATABASE mydb OWNER myuser; -- 授予权限 GRANT ALL PRIVILEGES ON DATABASE mydb TO myuser; 三、数据库基础操作 表操作 -- 创建表 CREATE TABLE employees ( id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL, email VARCHAR(100) UNIQUE, department VARCHAR(50), salary NUMERIC(10,2), hire_date DATE DEFAULT CURRENT_DATE, skills TEXT[] ); -- 修改表 ALTER TABLE employees ADD COLUMN phone VARCHAR(15); ALTER TABLE employees ALTER COLUMN department SET NOT NULL; -- 删除表 DROP TABLE IF EXISTS temp_employees; 数据操作(CRUD) -- 插入数据 INSERT INTO employees (name, email, department, salary) VALUES ('张伟', 'zhang@company.com', '研发部', 15000), ('李娜', 'li@company.com', '市场部', 12000); -- 查询数据 SELECT * FROM employees WHERE department = '研发部' AND salary > 13000; -- 更新数据 UPDATE employees SET salary = salary * 1.1 WHERE department = '研发部'; -- 删除数据 DELETE FROM employees WHERE id = 5; 事务管理 BEGIN; UPDATE accounts SET balance = balance - 100 WHERE id = 1; UPDATE accounts SET balance = balance + 100 WHERE id = 2; -- 提交事务 COMMIT; -- 出错时回滚 ROLLBACK; 四、数据类型详解 PostgreSQL提供丰富的数据类型: 类别 数据类型 描述 数值 SMALLINT, INTEGER, BIGINT 整数类型 NUMERIC(precision, scale) 精确小数 REAL, DOUBLE PRECISION 浮点数 字符 VARCHAR(n), TEXT 变长字符串 CHAR(n) 定长字符串 日期/时间 DATE, TIME, TIMESTAMP 日期时间类型 布尔 BOOLEAN true/false 二进制 BYTEA 二进制数据 几何 POINT, LINE, CIRCLE 几何图形 网络 INET, CIDR, MACADDR 网络地址 JSON JSON, JSONB JSON数据 数组 INT[], TEXT[] 数组类型 范围 INT4RANGE, TSRANGE 范围类型 JSONB示例: CREATE TABLE products ( id SERIAL PRIMARY KEY, name VARCHAR(100), attributes JSONB ); INSERT INTO products (name, attributes) VALUES ('Laptop', '{"color": "silver", "memory": "16GB", "ports": ["USB-C", "HDMI"]}'); -- 查询JSON字段 SELECT name, attributes->>'color' AS color FROM products WHERE attributes @> '{"memory": "16GB"}'; 五、高级查询技术 窗口函数 SELECT name, department, salary, AVG(salary) OVER (PARTITION BY department) AS avg_dept_salary, RANK() OVER (ORDER BY salary DESC) AS salary_rank FROM employees; CTE(公共表表达式) WITH regional_sales AS ( SELECT region, SUM(amount) AS total_sales FROM orders GROUP BY region ), top_regions AS ( SELECT region FROM regional_sales WHERE total_sales > (SELECT SUM(total_sales)/10 FROM regional_sales) ) SELECT region, product, SUM(quantity) AS product_units FROM orders WHERE region IN (SELECT region FROM top_regions) GROUP BY region, product; 全文搜索 -- 创建全文搜索索引 CREATE TABLE documents ( id SERIAL PRIMARY KEY, title TEXT, body TEXT ); CREATE INDEX idx_documents_search ON documents USING GIN (to_tsvector('english', body)); -- 执行搜索 SELECT title, ts_headline(body, q) AS highlight FROM documents, to_tsquery('english', 'database & performance') q WHERE to_tsvector('english', body) @@ q; 六、索引与性能优化 索引类型 索引类型 适用场景 示例 B-tree 默认索引,适用于等值查询和范围查询 CREATE INDEX idx_name ON table (column) Hash 等值查询(仅内存表) CREATE INDEX idx_name ON table USING HASH (column) GIN JSONB、数组、全文搜索 CREATE INDEX idx_gin ON table USING GIN (jsonb_column) GiST 几何数据、全文搜索 CREATE INDEX idx_gist ON table USING GiST (geom_column) SP-GiST 空间分区数据 CREATE INDEX idx_spgist ON table USING SP-GiST (phone) BRIN 大型表,按物理顺序存储 CREATE INDEX idx_brin ON table USING BRIN (timestamp) 查询优化技巧 使用EXPLAIN分析 EXPLAIN ANALYZE SELECT * FROM large_table WHERE category_id = 10; **避免SELECT *** -- 不推荐 SELECT * FROM orders; -- 推荐 SELECT order_id, customer_id, order_date FROM orders; 批量操作优化 -- 使用COPY导入数据 COPY large_table FROM '/path/to/data.csv' DELIMITER ',' CSV HEADER; 分区表 -- 创建分区表 CREATE TABLE sales ( id SERIAL, sale_date DATE, amount NUMERIC ) PARTITION BY RANGE (sale_date); -- 创建子分区 CREATE TABLE sales_2023 PARTITION OF sales FOR VALUES FROM ('2023-01-01') TO ('2024-01-01'); 七、事务与并发控制 事务隔离级别 -- 查看当前隔离级别 SHOW default_transaction_isolation; -- 设置隔离级别 SET TRANSACTION ISOLATION LEVEL READ COMMITTED; 锁机制 -- 显式锁定 BEGIN; LOCK TABLE accounts IN EXCLUSIVE MODE; -- 执行操作 COMMIT; -- 行级锁 SELECT * FROM orders WHERE id = 100 FOR UPDATE; MVCC(多版本并发控制) PostgreSQL使用MVCC处理并发,避免读写冲突: stateDiagram-v2 [*] --> Active Active --> Committed Active --> Aborted Committed --> [*] Aborted --> [*] 八、存储过程与函数 PL/pgSQL函数 CREATE OR REPLACE FUNCTION calculate_tax(amount NUMERIC) RETURNS NUMERIC AS $$ DECLARE tax_rate NUMERIC := 0.1; tax_amount NUMERIC; BEGIN tax_amount := amount * tax_rate; RETURN tax_amount; EXCEPTION WHEN division_by_zero THEN RAISE NOTICE 'Division by zero occurred'; RETURN 0; END; $$ LANGUAGE plpgsql; -- 调用函数 SELECT calculate_tax(1000);-- 返回100.00 返回结果集 CREATE OR REPLACE FUNCTION get_employees(dept_name VARCHAR) RETURNS TABLE (id INT, name VARCHAR, salary NUMERIC) AS $$ BEGIN RETURN QUERY SELECT e.id, e.name, e.salary FROM employees e WHERE e.department = dept_name; END; $$ LANGUAGE plpgsql; -- 调用 SELECT * FROM get_employees('研发部'); 九、触发器与规则 创建触发器 -- 审计日志表 CREATE TABLE audit_log ( id SERIAL PRIMARY KEY, table_name VARCHAR(100), action VARCHAR(10), old_data JSONB, new_data JSONB, change_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- 触发器函数 CREATE OR REPLACE FUNCTION log_employee_changes() RETURNS TRIGGER AS $$ BEGIN IF (TG_OP = 'DELETE') THEN INSERT INTO audit_log (table_name, action, old_data) VALUES (TG_TABLE_NAME, 'DELETE', to_jsonb(OLD)); ELSIF (TG_OP = 'UPDATE') THEN INSERT INTO audit_log (table_name, action, old_data, new_data) VALUES (TG_TABLE_NAME, 'UPDATE', to_jsonb(OLD), to_jsonb(NEW)); ELSIF (TG_OP = 'INSERT') THEN INSERT INTO audit_log (table_name, action, new_data) VALUES (TG_TABLE_NAME, 'INSERT', to_jsonb(NEW)); END IF; RETURN NEW; END; $$ LANGUAGE plpgsql; -- 创建触发器 CREATE TRIGGER employees_audit AFTER INSERT OR UPDATE OR DELETE ON employees FOR EACH ROW EXECUTE FUNCTION log_employee_changes(); 十、备份与恢复 逻辑备份(pg_dump) # 备份单个数据库 pg_dump -U username -d dbname -f backup.sql # 备份所有数据库 pg_dumpall -U postgres -f alldb.sql # 压缩备份 pg_dump -U username -d dbname | gzip > backup.gz 物理备份(PITR) # 开启WAL归档 # postgresql.conf中设置: wal_level = replica archive_mode = on archive_command = 'cp %p /path/to/wal_archive/%f' # 创建基础备份 pg_basebackup -D /path/to/backup -U replicator -P -Fp -Xs -R 恢复数据库 # 从逻辑备份恢复 psql -U postgres -d newdb -f backup.sql # 时间点恢复(PITR) 1. 恢复基础备份 2. 创建recovery.conf文件: restore_command = 'cp /path/to/wal_archive/%f %p' recovery_target_time = '2023-05-01 12:00:00' 3. 启动PostgreSQL 十一、高可用与复制 流复制配置 # 主库配置 (postgresql.conf) wal_level = replica max_wal_senders = 10 hot_standby = on # 创建复制用户 CREATE USER replicator WITH REPLICATION ENCRYPTED PASSWORD 'replpass'; # 备库配置 pg_basebackup -h master-host -U replicator -D /var/lib/postgres/data -P -Xs -R # 备库postgresql.auto.conf中自动生成: primary_conninfo = 'host=master-host user=replicator password=replpass' 使用pgPool-II负载均衡 # 安装pgpool-II sudo apt install pgpool2 # 配置/etc/pgpool2/pgpool.conf backend_hostname0 = 'master-host' backend_port0 = 5432 backend_weight0 = 1 backend_hostname1 = 'replica1-host' backend_port1 = 5432 backend_weight1 = 1 # 启动pgpool systemctl start pgpool 十二、Python集成 import psycopg2 from psycopg2 import sql # 连接数据库 conn = psycopg2.connect( dbname="mydb", user="myuser", password="mypassword", host="localhost", port="5432" ) try: # 创建游标 with conn.cursor() as cursor: # 执行查询 cursor.execute("SELECT * FROM employees WHERE department = %s", ('研发部',)) for record in cursor.fetchall(): print(f"ID: {record[0]}, Name: {record[1]}, Salary: {record[4]}") # 插入数据 insert_query = sql.SQL(""" INSERT INTO employees (name, email, department, salary) VALUES (%s, %s, %s, %s) RETURNING id """) cursor.execute(insert_query, ('王芳', 'wang@company.com', '市场部', 13000)) new_id = cursor.fetchone()[0] print(f"New employee ID: {new_id}") # 提交事务 conn.commit() except Exception as e: print(f"Database error: {e}") conn.rollback() finally: # 关闭连接 if conn: conn.close() 十三、学习资源 官方文档 - 最权威的参考资料 PGExercises - PostgreSQL交互式练习平台 PostgreSQL Tutorial - 免费教程网站 pgAdmin - 官方图形化管理工具 PostgreSQL Weekly - 每周更新资讯 graph LR A[学习基础SQL] --> B[掌握PostgreSQL特性] B --> C[性能优化] C --> D[高可用架构] D --> E[扩展开发] E --> F[成为PostgreSQL专家] PostgreSQL作为功能最强大的开源数据库,适用于从嵌入式系统到企业级应用的各种场景。通过本教程,你已经掌握了其核心功能和高级技巧,建议结合实际项目深入实践。记住:正确的数据库设计比后期优化更重要! 参考&致谢

2025/11/22
articleCard.readMore

MySQL 使用全面指南:从入门到高级实践

MySQL 是全球最流行的开源关系型数据库管理系统,广泛应用于 Web 应用开发。本教程将全面介绍 MySQL 的安装配置、核心操作、高级功能及最佳实践。 📦 一、MySQL 安装与配置 安装 MySQL # Ubuntu/Debian sudo apt update sudo apt install mysql-server # CentOS/RHEL sudo yum install mysql-server # macOS (Homebrew) brew install mysql # Windows 下载官方安装包:https://dev.mysql.com/downloads/mysql/ 初始配置 # 安全配置向导(设置root密码等) sudo mysql_secure_installation # 启动/停止服务 sudo systemctl start mysql sudo systemctl stop mysql # 设置开机启动 sudo systemctl enable mysql 配置文件详解(my.cnf) [mysqld] # 数据存储目录 datadir=/var/lib/mysql # 允许最大连接数 max_connections=200 # 查询缓存大小 query_cache_size=128M # 字符集设置 character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci # InnoDB 缓冲池大小 (推荐70-80%内存) innodb_buffer_pool_size=1G # 错误日志路径 log-error=/var/log/mysql/error.log 🔌 二、MySQL 基础操作 连接 MySQL # 本地连接 mysql -u root -p # 远程连接 mysql -h 192.168.1.100 -P 3306 -u username -p 数据库操作 -- 创建数据库 CREATE DATABASE company_db; -- 查看所有数据库 SHOW DATABASES; -- 选择数据库 USE company_db; -- 删除数据库 DROP DATABASE legacy_db; 表操作 -- 创建员工表 CREATE TABLE employees ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) NOT NULL, email VARCHAR(100) UNIQUE, department VARCHAR(50), salary DECIMAL(10,2), hire_date DATE DEFAULT (CURRENT_DATE) ); -- 查看表结构 DESCRIBE employees; -- 修改表结构 ALTER TABLE employees ADD COLUMN phone VARCHAR(15); ALTER TABLE employees MODIFY COLUMN salary FLOAT; -- 删除表 DROP TABLE temp_table; 📊 三、数据操作(CRUD) 插入数据 -- 单条插入 INSERT INTO employees (name, email, department, salary) VALUES ('张三', 'zhang@company.com', '技术部', 15000); -- 批量插入 INSERT INTO employees (name, email, department, salary) VALUES ('李四', 'li@company.com', '市场部', 12000), ('王五', 'wang@company.com', '财务部', 13000), ('赵六', 'zhao@company.com', '技术部', 16000); 查询数据 -- 基本查询 SELECT * FROM employees; -- 条件查询 SELECT name, salary FROM employees WHERE department = '技术部' AND salary > 14000; -- 排序与分页 SELECT * FROM employees ORDER BY hire_date DESC LIMIT 5 OFFSET 0; -- 模糊查询 SELECT * FROM employees WHERE name LIKE '张%' OR email LIKE '%@company.com'; 更新数据 -- 更新单条记录 UPDATE employees SET salary = salary * 1.1 WHERE id = 1; -- 批量更新 UPDATE employees SET department = '研发部' WHERE department = '技术部'; 删除数据 -- 删除单条记录 DELETE FROM employees WHERE id = 5; -- 清空表数据 TRUNCATE TABLE temp_employees; 🔗 四、高级查询技巧 多表连接 -- 创建部门表 CREATE TABLE departments ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) NOT NULL, location VARCHAR(100) ); -- 内连接 SELECT e.name, e.salary, d.name AS dept_name FROM employees e INNER JOIN departments d ON e.department_id = d.id; -- 左连接 SELECT e.name, d.name AS dept_name FROM employees e LEFT JOIN departments d ON e.department_id = d.id; 聚合函数 -- 基本聚合 SELECT COUNT(*) AS total_employees, AVG(salary) AS avg_salary, MAX(salary) AS max_salary, MIN(hire_date) AS oldest_hire FROM employees; -- 分组统计 SELECT department, COUNT(*) AS employee_count, AVG(salary) AS avg_salary FROM employees GROUP BY department HAVING COUNT(*) > 3; 子查询 -- 单行子查询 SELECT name, salary FROM employees WHERE salary > (SELECT AVG(salary) FROM employees); -- IN子查询 SELECT name FROM employees WHERE department_id IN ( SELECT id FROM departments WHERE location = '北京' ); -- EXISTS子查询 SELECT d.name FROM departments d WHERE EXISTS ( SELECT 1 FROM employees e WHERE e.department_id = d.id ); ⚡ 五、索引与性能优化 索引类型 -- 创建普通索引 CREATE INDEX idx_email ON employees(email); -- 创建唯一索引 CREATE UNIQUE INDEX uidx_email ON employees(email); -- 创建复合索引 CREATE INDEX idx_dept_salary ON employees(department, salary); -- 查看索引 SHOW INDEX FROM employees; -- 删除索引 DROP INDEX idx_email ON employees; 查询优化技巧 -- 使用EXPLAIN分析查询 EXPLAIN SELECT * FROM employees WHERE department = '技术部'; -- 避免SELECT * SELECT id, name, department FROM employees; -- 合理使用LIMIT SELECT * FROM large_table LIMIT 100; -- 避免在WHERE子句中使用函数 -- 不推荐 SELECT * FROM employees WHERE YEAR(hire_date) = 2023; -- 推荐 SELECT * FROM employees WHERE hire_date BETWEEN '2023-01-01' AND '2023-12-31'; 👥 六、用户与权限管理 用户管理 -- 创建用户 CREATE USER 'dev_user'@'localhost' IDENTIFIED BY 'secure_password'; -- 修改密码 ALTER USER 'dev_user'@'localhost' IDENTIFIED BY 'new_password'; -- 删除用户 DROP USER 'old_user'@'%'; 权限管理 -- 授予权限 GRANT SELECT, INSERT, UPDATE ON company_db.* TO 'dev_user'@'localhost'; -- 授予所有权限 GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' WITH GRANT OPTION; -- 查看权限 SHOW GRANTS FOR 'dev_user'@'localhost'; -- 撤销权限 REVOKE DELETE ON company_db.* FROM 'dev_user'@'localhost'; -- 刷新权限 FLUSH PRIVILEGES; 💾 七、备份与恢复 备份数据库 # 备份单个数据库 mysqldump -u root -p company_db > company_db_backup.sql # 备份所有数据库 mysqldump -u root -p --all-databases > all_dbs_backup.sql # 压缩备份 mysqldump -u root -p company_db | gzip > company_db_backup.sql.gz 恢复数据库 # 恢复数据库 mysql -u root -p company_db < company_db_backup.sql # 从压缩文件恢复 gunzip < company_db_backup.sql.gz | mysql -u root -p company_db # 单表恢复 mysql -u root -p company_db employees < employees_backup.sql 定时备份(Cron Job) # 添加定时任务 crontab -e # 每天凌晨2点备份 0 2 * * * /usr/bin/mysqldump -u root -pPASSWORD company_db | gzip > /backups/company_db_$(date +\%F).sql.gz 🔄 八、事务与锁机制 事务处理 -- 开始事务 START TRANSACTION; -- 执行操作 UPDATE accounts SET balance = balance - 100 WHERE id = 1; UPDATE accounts SET balance = balance + 100 WHERE id = 2; -- 提交事务 COMMIT; -- 回滚事务 ROLLBACK; 事务隔离级别 -- 查看当前隔离级别 SELECT @@transaction_isolation; -- 设置隔离级别 SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; 锁机制 -- 手动加锁 SELECT * FROM orders WHERE id = 100 FOR UPDATE; -- 查看当前锁 SHOW OPEN TABLES WHERE In_use > 0; 🧩 九、存储过程与函数 创建存储过程 DELIMITER // CREATE PROCEDURE IncreaseSalaries(IN dept_name VARCHAR(50), IN increase_percent FLOAT) BEGIN UPDATE employees SET salary = salary * (1 + increase_percent/100) WHERE department = dept_name; END // DELIMITER ; -- 调用存储过程 CALL IncreaseSalaries('技术部', 10); 创建函数 DELIMITER // CREATE FUNCTION GetEmployeeCount(dept_name VARCHAR(50)) RETURNS INT DETERMINISTIC BEGIN DECLARE emp_count INT; SELECT COUNT(*) INTO emp_count FROM employees WHERE department = dept_name; RETURN emp_count; END // DELIMITER ; -- 使用函数 SELECT GetEmployeeCount('市场部'); ⏰ 十、触发器与事件调度 创建触发器 -- 审计日志表 CREATE TABLE audit_log ( id INT AUTO_INCREMENT PRIMARY KEY, action VARCHAR(20), table_name VARCHAR(50), record_id INT, change_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- 创建触发器 DELIMITER // CREATE TRIGGER after_employee_update AFTER UPDATE ON employees FOR EACH ROW BEGIN INSERT INTO audit_log (action, table_name, record_id) VALUES ('UPDATE', 'employees', NEW.id); END // DELIMITER ; 事件调度 -- 启用事件调度器 SET GLOBAL event_scheduler = ON; -- 创建定期清理事件 CREATE EVENT daily_audit_cleanup ON SCHEDULE EVERY 1 DAY STARTS CURRENT_TIMESTAMP DO DELETE FROM audit_log WHERE change_time < NOW() - INTERVAL 30 DAY; 🐍 十一、Python 中使用 MySQL import mysql.connector from mysql.connector import Error try: # 创建连接 connection = mysql.connector.connect( host='localhost', user='python_user', password='secure_pass', database='company_db' ) if connection.is_connected(): cursor = connection.cursor() # 执行查询 cursor.execute("SELECT * FROM employees") employees = cursor.fetchall() # 插入数据 insert_query = """ INSERT INTO employees (name, email, department, salary) VALUES (%s, %s, %s, %s) """ employee_data = ('钱七', 'qian@company.com', '人事部', 11000) cursor.execute(insert_query, employee_data) connection.commit() # 更新数据 update_query = "UPDATE employees SET salary = salary * 1.05 WHERE department = %s" cursor.execute(update_query, ('技术部',)) connection.commit() except Error as e: print("数据库错误:", e) finally: if connection.is_connected(): cursor.close() connection.close() 🚨 十二、常见问题解决 忘记 root 密码 # 停止MySQL服务 sudo systemctl stop mysql # 启动安全模式 sudo mysqld_safe --skip-grant-tables & # 登录并修改密码 mysql -u root FLUSH PRIVILEGES; ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password'; FLUSH PRIVILEGES; exit; # 重启MySQL sudo systemctl restart mysql 性能问题诊断 -- 查看慢查询 SHOW VARIABLES LIKE 'slow_query_log'; SHOW VARIABLES LIKE 'long_query_time'; -- 查看进程列表 SHOW PROCESSLIST; -- 优化表 OPTIMIZE TABLE large_table; -- 分析表 ANALYZE TABLE employees; 连接问题排查 # 错误:ERROR 1045 (28000) # 解决方案:检查用户名/密码,确保主机权限 # 错误:ERROR 2002 (HY000) # 解决方案:确认MySQL服务运行中,检查socket路径 # 错误:ERROR 2013 (HY000) # 解决方案:增加连接超时时间 wait_timeout 📚 学习资源推荐 MySQL 官方文档 - 最权威的参考资料 MySQL Tutorial - 免费教程网站 LeetCode 数据库题库 - 实战练习 MySQL Workbench - 官方图形化管理工具 Percona Toolkit - 高级管理工具集 graph TD A[安装MySQL] --> B[创建数据库] B --> C[设计表结构] C --> D[数据操作CRUD] D --> E[高级查询] E --> F[性能优化] F --> G[备份恢复] G --> H[事务管理] H --> I[程序集成] MySQL 作为最流行的关系型数据库之一,掌握其核心功能对开发者和DBA至关重要。本教程覆盖了从基础到高级的全面知识体系,建议结合实际项目实践加深理解。记住,数据库设计优化往往比硬件升级更能提升性能! 参考&致谢 系列教程 全部文章RSS订阅 数据库系列 SQL命令使用教程:从入门到精通 SQLite使用全面教程:轻量级数据库的终极指南 MySQL命令行使用全面教程:从入门到精通 MySQL 使用全面指南:从入门到高级实践 PostgreSQL 使用全面指南:从入门到企业级应用 PostgreSQL命令行使用教程:掌握 psql 工具 PostgreSQL 实现原理深度剖析:高性能数据库引擎的核心机制

2025/11/22
articleCard.readMore

SQLite使用全面教程:轻量级数据库的终极指南

SQLite是世界上最广泛部署的数据库引擎,以其轻量、零配置和嵌入式特性著称。本教程将带你从基础到高级全面掌握SQLite的使用技巧,特别强化了数据库连接和命令行操作部分。 一、安装与配置 Windows安装 访问 SQLite官网 下载 sqlite-tools-win32-*.zip 解压后添加目录到系统PATH 命令行输入 sqlite3 验证安装 Linux/macOS安装 # Debian/Ubuntu sudo apt install sqlite3 # macOS (需先安装Homebrew) brew install sqlite 二、数据库连接与基本操作 创建并连接数据库 # 创建或打开数据库(不存在则创建) sqlite3 mydatabase.db 成功连接后,提示符变为: sqlite> 实时操作示例 -- 创建用户表 CREATE TABLE users ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, email TEXT UNIQUE, created_at DATETIME DEFAULT CURRENT_TIMESTAMP ); -- 插入数据 INSERT INTO users (name, email) VALUES ('张三', 'zhangsan@example.com'), ('李四', 'lisi@example.com'); -- 查询数据 SELECT * FROM users; -- 退出SQLite命令行 .quit 连接到现有数据库 # 连接到已存在的数据库 sqlite3 existing_db.db 内存数据库(临时数据库) # 创建内存中的临时数据库(关闭后消失) sqlite3 :memory: 三、SQLite命令行工具高级用法 常用点命令 命令 说明 .open test.db 打开/创建数据库 .tables 显示所有表 .schema users 显示表结构 .mode column 列模式显示 .headers on 显示列名 .show 显示当前配置 .quit 退出命令行 .help 显示帮助信息 数据导入导出实战 导出数据到CSV: sqlite3 mydatabase.db .headers on .mode csv .output users.csv SELECT * FROM users; .output stdout 从CSV导入数据: -- 创建临时表 CREATE TABLE temp_import( name TEXT, email TEXT ); -- 导入数据 .mode csv .import /path/to/new_users.csv temp_import -- 插入到主表 INSERT INTO users (name, email) SELECT name, email FROM temp_import; -- 清理临时表 DROP TABLE temp_import; 备份与恢复 完整备份: sqlite3 mydatabase.db ".backup 'backup.db'" 增量备份(使用WAL模式): # 启用WAL模式 sqlite3 mydatabase.db "PRAGMA journal_mode=WAL;" # 创建备份 cp mydatabase.db backup.db cp mydatabase.db-wal backup.db-wal cp mydatabase.db-shm backup.db-shm 四、Python集成实战 import sqlite3 from datetime import datetime # 连接数据库(不存在则创建) conn = sqlite3.connect('mydatabase.db') cursor = conn.cursor() # 创建表 cursor.execute('''CREATE TABLE IF NOT EXISTS orders ( id INTEGER PRIMARY KEY, user_id INTEGER, product TEXT, amount REAL, order_date TIMESTAMP, FOREIGN KEY(user_id) REFERENCES users(id))''') # 插入订单数据 user_id = 1 orders = [ (user_id, 'Laptop', 1200.50, datetime.now()), (user_id, 'Mouse', 25.99, datetime.now()) ] cursor.executemany("INSERT INTO orders (user_id, product, amount, order_date) VALUES (?, ?, ?, ?)", orders) # 复杂查询:用户及其订单 cursor.execute('''SELECT users.name, orders.product, orders.amount FROM users JOIN orders ON users.id = orders.user_id''') for row in cursor.fetchall(): print(f"{row} purchased {row} for ${row:.2f}") # 提交并关闭连接 conn.commit() conn.close() 五、高级特性与优化 事务处理 BEGIN TRANSACTION; -- 转账操作 UPDATE accounts SET balance = balance - 100 WHERE id = 1; UPDATE accounts SET balance = balance + 100 WHERE id = 2; -- 提交事务 COMMIT; -- 出错时回滚 -- ROLLBACK; 性能优化技巧 索引优化: CREATE INDEX idx_users_email ON users(email); CREATE INDEX idx_orders_date ON orders(order_date); WAL模式: PRAGMA journal_mode=WAL;-- 启用写前日志 缓存调整: PRAGMA cache_size = -2000;-- 设置2000页缓存(约3.2MB) 查询优化: EXPLAIN QUERY PLAN SELECT * FROM users WHERE email = 'test@example.com'; 全文搜索 -- 创建虚拟表 CREATE VIRTUAL TABLE docs USING fts5(title, content); -- 插入数据 INSERT INTO docs VALUES ('SQLite Guide', 'Comprehensive guide to SQLite database'), ('Python Tutorial', 'Learn Python programming language'); -- 全文搜索 SELECT * FROM docs WHERE docs MATCH 'guide database'; 六、图形化管理工具推荐 DB Browser for SQLite: 开源可视化工具 下载地址:https://sqlitebrowser.org/ SQLiteStudio: 跨平台多功能管理器 下载地址:https://sqlitestudio.pl/ 七、常见问题解决方案 数据库锁定问题 # 查看锁定进程 lsof mydatabase.db # 安全解锁 cp mydatabase.db unlocked.db sqlite3 unlocked.db "PRAGMA wal_checkpoint;" 数据库修复 # 导出数据 sqlite3 corrupt.db .dump > recovery.sql # 重建数据库 sqlite3 new.db < recovery.sql 跨数据库操作 -- 附加另一个数据库 ATTACH DATABASE 'another.db' AS other; -- 跨数据库查询 SELECT * FROM main.users UNION ALL SELECT * FROM other.users; -- 分离数据库 DETACH DATABASE other; 八、实际应用场景 移动应用数据存储 // Android示例 SQLiteDatabase db = openOrCreateDatabase("app_data.db", MODE_PRIVATE, null); db.execSQL("CREATE TABLE IF NOT EXISTS settings (key TEXT PRIMARY KEY, value TEXT)"); ContentValues values = new ContentValues(); values.put("key", "theme"); values.put("value", "dark"); db.insert("settings", null, values); 网站数据分析 # 日志分析示例 import sqlite3 conn = sqlite3.connect('weblog.db') conn.execute('''CREATE TABLE IF NOT EXISTS visits (id INTEGER PRIMARY KEY, ip TEXT, url TEXT, timestamp DATETIME DEFAULT CURRENT_TIMESTAMP)''') # 模拟插入访问记录 conn.execute("INSERT INTO visits (ip, url) VALUES (?, ?)", ('192.168.1.1', '/homepage')) conn.commit() 学习资源推荐 SQLite官方文档 - 最权威的参考指南 SQLite Tutorial - 交互式学习平台 SQLite Fiddle - 在线SQLite测试环境 SQLite Viewer - 在线查看SQLite文件 graph TD A[启动SQLite] --> B{数据库存在?} B -->|是| C[打开数据库] B -->|否| D[创建新数据库] C --> E[执行SQL操作] D --> E E --> F[保存更改] F --> G[退出SQLite] 通过本增强版教程,你不仅掌握了SQLite的核心操作,还学习了实际开发中的高级技巧。SQLite的轻量级特性使其成为嵌入式系统、移动应用和小型网站的完美选择,立即开始你的SQLite项目实践吧! 参考&致谢 系列教程 全部文章RSS订阅 数据库系列 SQL命令使用教程:从入门到精通 SQLite使用全面教程:轻量级数据库的终极指南 MySQL命令行使用全面教程:从入门到精通 MySQL 使用全面指南:从入门到高级实践 PostgreSQL 使用全面指南:从入门到企业级应用 PostgreSQL命令行使用教程:掌握 psql 工具 PostgreSQL 实现原理深度剖析:高性能数据库引擎的核心机制

2025/11/22
articleCard.readMore

MySQL命令行使用全面教程:从入门到精通

MySQL是最流行的关系型数据库之一,掌握其命令行工具是每位开发者和DBA的必备技能。本教程将带你系统学习MySQL命令行的核心功能和实用技巧。 🚀 连接MySQL服务器 基础连接方式 # 连接到本地MySQL服务器 mysql -u root -p # 指定主机和端口 mysql -h 127.0.0.1 -P 3306 -u username -p # 连接后直接选择数据库 mysql -u root -p database_name 连接参数说明 参数 说明 示例 -u 用户名 -u admin -p 密码提示 (回车后输入密码) -h 主机地址 -h db.example.com -P 端口号 -P 3307 -D 指定数据库 -D mydb 🔍 数据库与表操作 数据库管理 -- 显示所有数据库 SHOW DATABASES; -- 创建新数据库 CREATE DATABASE school_db; -- 选择数据库 USE school_db; -- 删除数据库 DROP DATABASE old_db; 表操作 -- 创建学生表 CREATE TABLE students ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL, age INT CHECK (age >= 15), email VARCHAR(100) UNIQUE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- 显示所有表 SHOW TABLES; -- 查看表结构 DESCRIBE students; -- 修改表结构 ALTER TABLE students ADD COLUMN major VARCHAR(50); ALTER TABLE students MODIFY COLUMN age TINYINT; ALTER TABLE students DROP COLUMN email; 📊 数据操作(CRUD) 插入数据 INSERT INTO students (name, age) VALUES ('张三', 18), ('李四', 19), ('王五', 17); 查询数据 -- 查询所有数据 SELECT * FROM students; -- 条件查询 SELECT name, age FROM students WHERE age > 18; -- 排序和限制 SELECT * FROM students ORDER BY created_at DESC LIMIT 5; -- 模糊查询 SELECT * FROM students WHERE name LIKE '张%'; 更新数据 UPDATE students SET age = 20 WHERE name = '张三'; 删除数据 DELETE FROM students WHERE name = '王五'; 🔧 高级查询技巧 聚合函数 SELECT COUNT(*) AS total, AVG(age) AS avg_age, MIN(created_at) AS oldest, MAX(age) AS max_age FROM students; 分组统计 SELECT major, COUNT(*) AS student_count, AVG(age) AS avg_age FROM students GROUP BY major HAVING COUNT(*) > 5; 表连接 -- 创建课程表 CREATE TABLE courses ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50), instructor VARCHAR(50) ); -- 内连接查询 SELECT s.name, c.name AS course FROM students s JOIN courses c ON s.id = c.student_id; 👥 用户与权限管理 用户管理 -- 创建新用户 CREATE USER 'dev'@'localhost' IDENTIFIED BY 'password123'; -- 修改密码 ALTER USER 'dev'@'localhost' IDENTIFIED BY 'newpassword456'; -- 删除用户 DROP USER 'dev'@'localhost'; 权限管理 -- 授予权限 GRANT SELECT, INSERT, UPDATE ON school_db.* TO 'dev'@'localhost'; -- 查看权限 SHOW GRANTS FOR 'dev'@'localhost'; -- 撤销权限 REVOKE UPDATE ON school_db.* FROM 'dev'@'localhost'; 📤 数据导入导出 导出数据 # 导出整个数据库 mysqldump -u root -p school_db > school_db.sql # 导出特定表 mysqldump -u root -p school_db students > students.sql # 导出为CSV格式 mysql -u root -p -e "SELECT * FROM students" school_db > students.csv 导入数据 # 导入SQL文件 mysql -u root -p school_db < backup.sql # 导入CSV数据 mysql -u root -p school_db -e " LOAD DATA INFILE '/path/to/students.csv' INTO TABLE students FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' IGNORE 1 ROWS;" ⚙️ 配置与优化 配置文件(my.cnf) [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock log-error=/var/log/mysql/error.log pid-file=/var/run/mysql/mysql.pid # 性能优化 innodb_buffer_pool_size=1G max_connections=200 query_cache_size=128M 性能分析 -- 查看查询执行计划 EXPLAIN SELECT * FROM students WHERE age > 18; -- 查看进程列表 SHOW PROCESSLIST; -- 优化表 OPTIMIZE TABLE students; 🚨 常见问题解决 忘记root密码 停止MySQL服务 启动安全模式: mysqld_safe --skip-grant-tables & 登录并修改密码: FLUSH PRIVILEGES; ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpassword'; 重启MySQL服务 连接错误 # 错误:ERROR 1045 (28000) # 解决方案:检查用户名/密码,确保主机权限 # 错误:ERROR 2002 (HY000) # 解决方案:确认MySQL服务运行中,检查socket路径 备份与恢复 # 定时备份脚本 mysqldump -u root -p --all-databases | gzip > /backups/mysql-$(date +%F).sql.gz # 恢复备份 gunzip < /backups/mysql-2023-01-01.sql.gz | mysql -u root -p 💡 实用技巧 批处理模式 mysql -u root -p -e "SHOW DATABASES; SELECT VERSION();" # 执行SQL脚本 mysql -u root -p < script.sql 输出格式化 -- 垂直显示结果 SELECT * FROM students \G -- 表格格式 SELECT * FROM students \T -- 导出为HTML SELECT * FROM students --html 命令历史 # 查看历史命令 cat ~/.mysql_history # 实时监控查询 mysqladmin -u root -p processlist 📚 学习资源推荐 MySQL官方文档 MySQL Tutorial SQLZoo MySQL练习 MySQL Workbench图形工具 通过掌握这些MySQL命令和技巧,你将能够高效地管理和操作数据库。实践是最好的学习方式 - 立即创建你的第一个数据库项目吧! 附录:常用命令速查表 类别 命令 说明 连接 mysql -u user -p 连接数据库 数据库 SHOW DATABASES; 显示所有数据库 CREATE DATABASE dbname; 创建数据库 USE dbname; 选择数据库 表操作 SHOW TABLES; 显示所有表 DESCRIBE tablename; 查看表结构 ALTER TABLE ... 修改表结构 数据 SELECT ... FROM ... 查询数据 INSERT INTO ... VALUES ... 插入数据 UPDATE ... SET ... WHERE ... 更新数据 DELETE FROM ... WHERE ... 删除数据 用户 CREATE USER ... 创建用户 GRANT ... ON ... TO ... 授予权限 维护 SHOW PROCESSLIST; 查看活动连接 EXPLAIN SELECT ... 分析查询性能 参考&致谢 系列教程 全部文章RSS订阅 数据库系列 SQL命令使用教程:从入门到精通 SQLite使用全面教程:轻量级数据库的终极指南 MySQL命令行使用全面教程:从入门到精通 MySQL 使用全面指南:从入门到高级实践 PostgreSQL 使用全面指南:从入门到企业级应用 PostgreSQL命令行使用教程:掌握 psql 工具 PostgreSQL 实现原理深度剖析:高性能数据库引擎的核心机制

2025/11/22
articleCard.readMore

PostgreSQL命令行使用教程:掌握 psql 工具

掌握PostgreSQL的命令行工具psql是高效管理数据库的关键。本文将带你全面了解这个强大的交互式终端工具的各种使用方法,包括各种常见问题和技巧总结。 🚀 启动psql 基本连接方式 # 连接到本地默认数据库 psql # 指定用户名和数据库 psql -U username -d dbname # 指定主机和端口 psql -h localhost -p 5432 -U postgres -d mydb 连接参数说明 参数 说明 示例 -U 用户名 -U admin -d 数据库名 -d sales_db -h 主机地址 -h db.example.com -p 端口号 -p 6432 -W 强制密码提示 -f 执行SQL文件 -f setup.sql 🔍 常用元命令(以\开头) 数据库操作 -- 列出所有数据库 \l -- 切换数据库 \c dbname -- 创建新数据库 CREATE DATABASE newdb; -- 删除数据库 DROP DATABASE olddb; 表操作 -- 列出当前数据库所有表 \dt -- 查看表结构 \d users -- 显示表详细信息 \d+ orders -- 显示表、视图和序列 \dv 用户和权限管理 -- 列出所有用户 \du -- 创建新用户 CREATE USER dev WITH PASSWORD 'secret123'; -- 修改密码 ALTER USER dev WITH PASSWORD 'newsecret456'; -- 授予权限 GRANT SELECT, INSERT ON customers TO dev; 信息查询 -- 显示当前连接信息 \conninfo -- 显示SQL版本 SELECT version(); -- 显示当前时间 SELECT NOW(); -- 显示当前数据库 SELECT current_database(); 文件操作 -- 执行SQL文件 \i path/to/script.sql -- 将查询结果输出到文件 \o output.txt SELECT * FROM products; \o 帮助系统 -- 显示所有元命令帮助 \? -- 显示SQL命令帮助 \h -- 查看特定命令帮助 \h CREATE TABLE 📊 查询与编辑 基本查询 -- 简单查询 SELECT * FROM employees; -- 条件查询 SELECT name, salary FROM employees WHERE salary > 50000; -- 排序 SELECT * FROM orders ORDER BY order_date DESC; -- 限制结果 SELECT * FROM products LIMIT 10; 多行编辑 -- 开启多行模式 \set PROMPT1 '%/%R%# ' -- 输入多行SQL语句 SELECT first_name, last_name, department FROM employees WHERE hire_date > '2020-01-01'; -- 结束多行输入(分号后回车) ; 查询历史 -- 查看历史命令 \s -- 保存历史到文件 \s history.sql -- 执行历史命令(!后跟行号) \! 15 🔄 导入导出数据 导出数据 # 导出整个数据库 pg_dump dbname > dbname.sql # 导出特定表 pg_dump -t tablename dbname > table.sql # 导出为CSV格式 \copy (SELECT * FROM users) TO '/path/to/users.csv' CSV HEADER 导入数据 # 导入SQL文件 psql -d dbname -f backup.sql # 导入CSV文件 \copy users FROM '/path/to/users.csv' CSV HEADER # 使用COPY命令(需要超级用户权限) COPY employees FROM '/path/to/employees.csv' DELIMITER ',' CSV HEADER; ⚙️ 配置与定制 配置文件(.psqlrc) 在用户主目录创建.psqlrc文件: -- 设置时间格式 \set HISTFILE ~/.psql_history- :DBNAME \set HISTSIZE 1000 -- 自定义提示符 \set PROMPT1 '%[%033[1;33m%]%/%R%#%[%033[0m%] ' -- 自动提交 \set AUTOCOMMIT on -- 常用别名 \set QUIET on \echo '常用别名:' \echo 'e: \\dt' \echo 's: SELECT * FROM' \set QUIET off 常用配置选项 -- 显示查询执行时间 \timing -- 扩展显示模式 \x auto -- 设置空值显示 \pset null '[NULL]' -- 设置边框样式 \pset border 2 🛠️ 高级技巧 事务管理 -- 开始事务 BEGIN; -- 执行多个操作 UPDATE accounts SET balance = balance - 100 WHERE id = 1; UPDATE accounts SET balance = balance + 100 WHERE id = 2; -- 提交或回滚 COMMIT; -- ROLLBACK; 性能分析 -- 查看查询计划 EXPLAIN SELECT * FROM large_table WHERE condition = 'value'; -- 详细分析(实际执行) EXPLAIN ANALYZE SELECT * FROM large_table; -- 索引使用情况 SELECT * FROM pg_stat_user_indexes; 维护操作 -- 重建索引 REINDEX TABLE large_table; -- 清理表空间 VACUUM FULL ANALYZE; -- 收集统计信息 ANALYZE VERBOSE; 🚨 常见问题解决 连接问题 # 认证失败 psql: FATAL: password authentication failed for user "user" # 解决方案: # 1. 检查pg_hba.conf配置 # 2. 重置密码:ALTER USER user WITH PASSWORD 'newpassword'; 权限问题 -- 权限拒绝 ERROR: permission denied for table tablename # 解决方案: GRANT SELECT, INSERT ON tablename TO username; 特殊字符处理 -- 包含引号的字符串 SELECT * FROM comments WHERE text E'contains \'quote\''; -- 使用$tag$语法 DO $$ BEGIN INSERT INTO logs (message) VALUES ('This contains ''quotes'''); END $$; 💡 实用技巧总结 历史命令:使用上下箭头键浏览历史命令 自动补全:Tab键补全对象名(表名、列名等) 变量设置:使用:variable存储和重用值 \set id 100 SELECT * FROM users WHERE id = :id; 快速编辑:使用\e打开编辑器编辑当前查询 执行系统命令:\!后跟系统命令 \! ls -l /backups 📚 学习资源 PostgreSQL官方文档 psql命令行备忘单 pgAdmin - PostgreSQL图形化管理工具 通过掌握这些psql命令和技巧,你将能够高效地管理和操作PostgreSQL数据库。不断练习和实践是成为数据库管理专家的关键! 参考&致谢

2025/11/22
articleCard.readMore

SQL命令使用教程:从入门到精通

作为一个程序员,不掌握SQL怎么行?掌握SQL是数据管理和分析的必备技能,本教程将带你系统学习SQL的核心命令和实用技巧,从入门到精通。 什么是SQL? SQL(Structured Query Language)是用于管理和操作关系型数据库的标准语言。通过SQL,你可以: 创建和管理数据库和表 插入、更新和删除数据 查询和分析数据 设置访问权限 管理事务 SQL主要分为四类命令: DDL(数据定义语言) - 创建/修改数据库结构 DML(数据操作语言) - 操作数据 DQL(数据查询语言) - 查询数据 DCL(数据控制语言) - 控制访问权限 一、数据库操作 创建数据库 CREATE DATABASE school_db; 查看所有数据库 SHOW DATABASES; 选择数据库 USE school_db; 删除数据库 DROP DATABASE school_db; 二、表操作 创建表 CREATE TABLE students ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL, age INT CHECK (age >= 15), email VARCHAR(100) UNIQUE, enrollment_date DATE DEFAULT CURRENT_DATE ); 查看表结构 DESCRIBE students; 修改表结构 -- 添加新列 ALTER TABLE students ADD COLUMN major VARCHAR(50); -- 修改列类型 ALTER TABLE students MODIFY COLUMN age SMALLINT; -- 删除列 ALTER TABLE students DROP COLUMN email; 删除表 DROP TABLE students; 三、数据操作(CRUD) 插入数据 INSERT INTO students (name, age, enrollment_date) VALUES ('张三', 18, '2023-09-01'), ('李四', 19, '2023-08-25'), ('王五', 17, '2023-09-05'); 查询数据 -- 查询所有列 SELECT * FROM students; -- 查询特定列 SELECT name, age FROM students; -- 带条件查询 SELECT * FROM students WHERE age > 18; 更新数据 UPDATE students SET age = 20 WHERE name = '张三'; 删除数据 DELETE FROM students WHERE name = '王五'; 四、高级查询技巧 排序结果 SELECT * FROM students ORDER BY age DESC, name ASC; 限制结果数量 SELECT * FROM students ORDER BY enrollment_date DESC LIMIT 5; 模糊查询 SELECT * FROM students WHERE name LIKE '张%'; 聚合函数 SELECT COUNT(*) AS total_students, AVG(age) AS average_age, MIN(enrollment_date) AS earliest_enrollment, MAX(age) AS max_age FROM students; 分组统计 SELECT major, COUNT(*) AS student_count, AVG(age) AS avg_age FROM students GROUP BY major HAVING COUNT(*) > 5; 五、表连接 创建课程表 CREATE TABLE courses ( course_id INT PRIMARY KEY AUTO_INCREMENT, course_name VARCHAR(50), instructor VARCHAR(50) ); CREATE TABLE enrollments ( student_id INT, course_id INT, enrollment_date DATE, FOREIGN KEY (student_id) REFERENCES students(id), FOREIGN KEY (course_id) REFERENCES courses(course_id) ); 内连接 SELECT s.name, c.course_name FROM students s INNER JOIN enrollments e ON s.id = e.student_id INNER JOIN courses c ON e.course_id = c.course_id; 左连接 SELECT s.name, c.course_name FROM students s LEFT JOIN enrollments e ON s.id = e.student_id LEFT JOIN courses c ON e.course_id = c.course_id; 六、子查询 单行子查询 SELECT * FROM students WHERE age > (SELECT AVG(age) FROM students); 多行子查询 SELECT * FROM courses WHERE course_id IN ( SELECT course_id FROM enrollments GROUP BY course_id HAVING COUNT(*) > 30 ); 七、索引优化 创建索引 -- 单列索引 CREATE INDEX idx_student_name ON students(name); -- 复合索引 CREATE INDEX idx_student_age_name ON students(age, name); -- 唯一索引 CREATE UNIQUE INDEX idx_unique_email ON students(email); 查看索引 SHOW INDEX FROM students; 删除索引 DROP INDEX idx_student_name ON students; 八、视图 创建视图 CREATE VIEW student_summary AS SELECT s.id, s.name, COUNT(e.course_id) AS courses_enrolled FROM students s LEFT JOIN enrollments e ON s.id = e.student_id GROUP BY s.id, s.name; 使用视图 SELECT * FROM student_summary WHERE courses_enrolled > 3; 删除视图 DROP VIEW student_summary; 九、事务管理 START TRANSACTION; -- 一系列操作 UPDATE accounts SET balance = balance - 100 WHERE id = 1; UPDATE accounts SET balance = balance + 100 WHERE id = 2; -- 提交事务 COMMIT; -- 或回滚事务 -- ROLLBACK; 十、最佳实践 命名规范:使用有意义的表名和列名(如student_id而非sid) **避免SELECT ***:只选择需要的列 使用参数化查询:防止SQL注入攻击 索引优化:为经常查询的列创建索引 定期备份:使用mysqldump或类似工具 mysqldump -u username -p database_name > backup.sql 常见错误处理 权限问题 -- 授予权限 GRANT SELECT, INSERT ON school_db.* TO 'user'@'localhost'; -- 撤销权限 REVOKE INSERT ON school_db.* FROM 'user'@'localhost'; 保留关键字冲突 -- 使用反引号包裹关键字 CREATE TABLE `user` ( `id` INT PRIMARY KEY, `name` VARCHAR(50) ); 学习资源推荐 SQLZoo - 交互式SQL学习平台 W3Schools SQL教程 - 基础到进阶教程 SQL Fiddle - 在线SQL测试环境 LeetCode数据库题库 - 实战练习题 通过本教程,你已经掌握了SQL的核心概念和常用命令。持续练习是提高SQL技能的关键 - 尝试创建自己的数据库项目,解决实际问题,你将成为SQL专家! 参考&致谢 系列教程 全部文章RSS订阅 数据库系列 SQL命令使用教程:从入门到精通 SQLite使用全面教程:轻量级数据库的终极指南 MySQL命令行使用全面教程:从入门到精通 MySQL 使用全面指南:从入门到高级实践 PostgreSQL 使用全面指南:从入门到企业级应用 PostgreSQL命令行使用教程:掌握 psql 工具 PostgreSQL 实现原理深度剖析:高性能数据库引擎的核心机制

2025/11/22
articleCard.readMore

Zlibrary 图书资源下载与 Calibre 图书管理打造结构化电子图书馆高阶教程

电子书不仅要下载可看,还要有书签,封面,简洁,作者,出版社等元数据帮助记忆和管理,否则,下载了一堆没法查找和没下载差不多!再加上世界上最大的电子书图书馆 Zlibrary ,这里几乎能找到所有的电子化图书!Calibre 和 Zlibrary 结合起来使用,就可以创建结构化的电子图书馆!本文将介绍Calibre 的使用,刮削,图书管理,web 界面的图书管理,重点介绍 Zlibrary 的使用。 Calibre 介绍 calibre 是一款功能强大且易于使用的电子书管理器。用户评价它 非常出色,是必备之选。它几乎可以帮你完成所有操作,并且比普通的电子书软件更胜一筹。它完全免费开源 ,无论是普通用户还是计算机专家 都能轻松上手。 Calibre 安装 PC 安装 支持平台有:windows macOS Linux Portable 手机安装 Android iOS 官网: https://calibre-ebook.com/download Docker 安装 更多平台Docker安装介绍,请看这里 Hexo Docker环境使用篇 安装docker curl -fsSL https://get.docker.com | sh && systemctl enable --now docker 安装docker-compose mkdir -p /usr/local/lib/docker/cli-plugins curl -SL https://get.daocloud.io/docker/compose/releases/download/v2.1.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/lib/docker/cli-plugins/docker-compose chmod +x /usr/local/lib/docker/cli-plugins/docker-compose 运行bookstack docker compose up -d 查看日志 docker logs -f calibre Calibre PC 管理并刮削电子书 Pc版的Calibre用来做数据库管理,有各种插件支持,是最方便的。 操作指南 Web界面的Calibre作为阅读界面,支持OPDS接口,可以手机访问! PC 版的Calibrez作为电子书导入,转移,和管理的工具更方便! 注意不要同时在web和PC端操作数据库,很容易导致数据库出bug。 虽然pc calibre有数据库恢复功能,大部分时间都可以成功恢复数据库,但是偶尔也有不能恢复的时候! 刮削插件安装 豆瓣刮削插件这里下载安装 Github 官方地址 Github 下载地址 本站自建加速地址 个人网盘加速下载 更新到1.10 如果打不开,多刷新几次! 添加书库 图书刮削 检查完毕就可以点击确认 数据库转移 这里最好建立一个临时书库作为转移和刮削预备用,防止意外崩溃导致数据库损坏或丢失! 你可以和你的好友之间共享或者转移某个书库。 图书太多,刮削太耗时间,合作刮削建立书库才是正途! Calibre数据库恢复 自动生成txt小说文本目录 很多时候,下载的TXT 电子小说没有目录,怎么办?Calibre 可以搞定,正则表达式自动生成目录! 第一步:导入书籍 在菜单中选择添加书籍 第二步:转换书籍 在结构检测中修改正则表达式以适配中文目录 //*[((name()='h1' or name()='h2') and re:test(., '\s*((chapter|book|section|part)\s+)|((prolog|prologue|epilogue)(\s+|$))', 'i')) or @class = 'chapter'] //*[name()='h1' or name()='h2'] 适配中文,修改后如下图。 //*[re:test(., "^\s*[第卷][0123456789一二三四五六七八九十零〇百千两]*[章回幕部节集卷].*", "i")] 修改为后点击确定,然后Calibre 就会开始转换书籍。 另一种实现方式 使用calibre生成txt文档目录 calibre-douban 插件 必装插件!使用 豆瓣 来刮削电子图书,中文图书识别更准确! Github: https://github.com/fugary/calibre-douban Calibre douban metadata download plugin. Based on https://book.douban.com web pages. Calibre插件 最近在使用calibre-web管理电子书,不过很多时候还是需要用到Calibre桌面版软件,批量管理,编辑电子书等功能,在calibre-web上已经使用calibre-web-douban-api搜素豆瓣元数据,但是桌面版Calibre软件缺没有办法使用,不过calibre可以使用插件,而且是使用python开发,因此可以把calibre-web-douban-api改造一下包装成calibre插件,简单元数据插件还是比较容易的 安装方法 下载地址:NewDouban.zip 从release页面下载zip包,然后再calibre中安装为插件即可。 alibre-douban是Calibre电子书软件的豆瓣元数据插件 下载地址 项目地址:https://github.com/fugary/calibre-douban 下载地址:https://github.com/fugary/calibre-douban/releases/latest/download/NewDouban.zip 代理下载:https://ghproxy.com/https://github.com/fugary/calibre-douban/releases/latest/download/NewDouban.zip 从release页面下载zip包,然后再calibre中安装为插件即可。 升级内容 删除了一些无用代码,另外增加功能: 增加gzip支持,有可能提升一点速度 增加随机毫秒延迟,减少被403的几率 增加Cookie输入框,可以填入浏览器登录后的Cookie,减少403 配置随机延迟 默认已开启随机延迟,也就是在并发请求详情数据的时候随机sleep一定的毫秒数,可以关闭: 参考代码 def random_sleep(self, log): random_sec = random.random() / 10 log.info("Random sleep time {}s".format(random_sec)) time.sleep(random_sec) Cookie配置 有时候可能我们的IP已经被拦了,这时可以自己登录豆瓣网站,然后把Cookie复制出来填进插件配置中。 IP被拦的错误如下: 有异常请求从你的 IP 发出,请 登录 使用豆瓣 用Chrome或者Edge浏览器打开https://www.douban.com,点击【登录】进入登录页面,登录成功之后,按F12打开开发者工具: 从Network,找到Doc类型,随便点击一个豆瓣的网址,进入Headers,找到Request Headers里面的Cookie字段,如图: 如果是中文版: 从网络,找到文档类型,随便点击一个豆瓣的网址,进入标头,找到请求标头里面的Cookie字段,如图: 找到Cookie:后面的部分,复制后面的内容,不包含Cookie:。 到Calibre插件配置页面填入Cookie: 然后就可以用用户的身份查询,一般是可以解决403问题。 常见错误 如果又遇到查询失败,可能是这个错误 …你访问豆瓣的方式有点像机器人程序。为了保护用户的数据,请向我们证明你是人类: 因为使用了Cookie,可以在浏览器中自己点击证明一下,再在calibre中重新查询即可。 Calibre Web 管理 talebook 最推荐的网络图书界面 Github Dockerhub Tips: 国人开发的,个人感觉更适合作为图书管理的界面 Compose 安装示例 talebook: image: talebook/talebook container_name: talebook hostname: talebook restart: always ports: - 90:80 volumes: - ${USERDIR}/talebook/data:/data environment: - PUID=${PUID} - PGID=${PGID} - TZ=${TZ} networks: public_access: aliases: - talebook CalibreWeb Github technosoft2000/calibre-web linuxserver/docker-calibre-web Dockerhub linuxserver/calibre-web Docs For docker-calibre-web Calibre相关的Docker很多,这是其中界面很漂亮的一个版本 注意这个Docker安装需要访问Github下载相关文件!注意你的网络是否正常 视频详细Calibre web讲解 教程视频作者是账户未命名 它的B站账号似乎没了,就放上youtube 统一视频地址! 说明一下,此账号不是博主! 网盘观看下载地址 Calibre 私人书库搭建教学!藏书、漫画、听书,在线阅读+格式转换 上面 Calibre 教程相关附件 相关命令 cat /etc/passwd | grep root [用户名] 刮削器不能使用的解决方法:https://fugary.com/?p=213 Compose 安装示例 linuxserver 的维护版本 默认登录密码: Username: admin Password: admin123 。创建Docker后,请及时修改默认密码! --- version: "2.1" services: calibre-web: image: linuxserver/calibre-web:latest container_name: calibre-web environment: - PUID=1000 - PGID=1000 - TZ=Europe/London - DOCKER_MODS=linuxserver/mods:universal-calibre #optional - OAUTHLIB_RELAX_TOKEN_SCOPE=1 #optional volumes: - /path/to/data:/config - /path/to/calibre/library:/books ports: - 8083:8083 restart: unless-stopped docker run -d \ --name=calibre-web \ -e PUID=1000 \ -e PGID=1000 \ -e TZ=Europe/London \ -e DOCKER_MODS=linuxserver/mods:universal-calibre `#optional` \ -e OAUTHLIB_RELAX_TOKEN_SCOPE=1 `#optional` \ -p 8083:8083 \ -v /path/to/data:/config \ -v /path/to/calibre/library:/books \ --restart unless-stopped \ lscr.io/linuxserver/calibre-web:latest 原作者精力不够,不再维护下面这个版本,请使用上面 linuxserver 维护的版本! calibre: image: technosoft2000/calibre-web container_name: calibre hostname: calibre restart: always volumes: - ${USERDIR}/Calibre/web/config:/calibre-web/config - ${USERDIR}/Calibre/web/kindlegen:/calibre-web/kindlegen - ${USERDIR}/Calibre/web/app:/calibre-web/app - ${USERDIR}/Calibre/books:/books ports: - 8283:8083 env_file: - .env environment: - PUID=${PUID} - PGID=${PGID} - TZ=${TZ} - USE_CONFIG_DIR=true - SET_CONTAINER_TIMEZONE=true Calibre PC 内容服务器 Calibre PC 端自带内容服务器,开启方法如下 开启后,就可以从下图所示的地址,在局域网中访问电子图书馆了 Zlibrary 使用 Zlibrary 简介 Z-Library(简称Z-Lib,前身为BookFinder)是一个影子图书馆和开放获取文件分享计划,用户可在此一网站上下载期刊文章以及各种类型的书籍。根据Z-Library的说法,截至2022年6月12日,其共收录了10,456,034本书和84,837,646篇文章[1]。Z-Library在其电子书搜索页面上宣称自己是“全球最大的数字图书馆”[2],并在文章搜索页面上称自身是“全球最大的科学文章存储库”[3]。它原是创世纪图书馆的镜像网站,并从该图书馆获得大部分馆藏。但它的一些馆藏由用户自行上载,并且不为创世纪图书馆所收藏[4]。该平台公开网域已于2022年11月3日遭到美国政府屏蔽。 ZLibrary虽然是一个俄国网站,但它拥有16种语言版本可供选择,下滑至网页末尾,即可切换语言。 ZLibrary访问地址: https://zlib.cydiar.com/ https://z-library.ec/ https://zh.z-library.sk/ https://bk.hallowlib.org/ 国内备用网址 http://zlibrary24tuxziyiyfr7zd46ytefdqbqd2axkmxm4o5374ptpc52fad.onion/ 洋葱路由地址 Zlibrary 简要 FAQ 截取用户最关心的几条介绍如下 我不能下载任何书籍!根据系统,我的IP地址已经达到每日下载的上限。 我们建议创建一个帐户并登录以避免此问题。 如果您没有登录,下载限制是根据您的设备 IP 地址计算的。 互联网提供商通常会为多个设备使用共享 IP 地址,在这种情况下,下载限制也会在这些设备之间共享。 我可以使用 电报机器人 下载多少本书? 使用我们的机器人,除了每日站点的限制外,您还可以下载更多书籍。例如,如果您的每日限制为下载 10 次,并且您已经使用了它,那么您可以通过机器人额外下载 10 本书(每天总共下载 20 次)。 或者您可以直接从机器人上下载这 20 本书。 绑定个人电报机器人 在下面页面最下方,根据指引操作 https://zh.z-library.sk/profileEdit/others 操作成功后可以看到如下操作指引: Hello, xxx! Welcome to your personal Z-Library telegram bot 📚Z-Library is the world's largest e-book library with over 10 million books and 80 million articles. We aim to make knowledge accessible to everyone. 🔹How do I download books via the bot? To find and download a book, just send the title of the book, author’s name, publisher or ISBN/ASIN number to the bot and click on the appeared link. You can also specify language and preferred file format. For example, “war and peace pdf” or “oscar wilde chinese epub”. 🔹How many books can I download? Using the bot, you can download more books in addition to your daily download limit on Z-Library website. For example, if your daily limit is 10 downloads, you have 10 extra downloads available in the bot (20 downloads in total). Or you can only use the bot and download 20 books from here. *Keep in mind that by downloading a book from the bot first, you are spending your daily website limit. 🔹How do I save files from Telegram? On Desktop: right click on the file > choose “Save as” option. On iOS: first open the file > use the Share button (upper right corner) > save it wherever you want (Files, iBooks, etc.). On Android: open the file > press the three dots button > choose “Save to Gallery or Downloads”. 🔹Can I share the bot with others? Only you, the bot creator, can use it to search and download books. You can share a link to your bot, in this case bot will prompt any other user to register a personal bot on the Z-Library website. 🔹How can I unlink my Telegram account? You can do this in your library profile on the website. *Be aware that the bot will not work without binding to Z-Library account. ——————- 📧 If you have any issues feel free to contact us via support@z-lib.fm 中文翻译: # Z-Library 个人机器人使用指南 您好!欢迎使用您的专属Z-Library电报机器人 📚 Z-Library是全球最大的电子图书馆,拥有超过1000万本书籍和8000万篇学术文章,致力于让知识触手可及。 ## 🔹 如何通过机器人下载书籍? 直接向机器人发送书籍标题、作者名、出版社或ISBN/ASIN编号,机器人会返回下载链接。 您可指定语言和文件格式,例如: 《战争与和平 pdf》 或 《王尔德 中文 epub》 ## 🔹 每日下载限额说明 机器人下载额度与网站额度叠加但共享上限: - 若网站每日限额10本,机器人可额外下载10本(总计20本) - *注意:通过机器人下载会同步消耗网站额度 ## 🔹 文件保存指南 ▫️ **电脑端**:右键文件 > 选择"另存为" ▫️ **iOS系统**:打开文件 > 点击右上角分享按钮 > 保存至"文件"/iBooks等应用 ▫️ **安卓系统**:打开文件 > 点击三点菜单 > 选择"保存到相册或下载目录" ## 🔹 机器人共享规则 此机器人仅限创建者本人使用。若分享机器人链接,其他用户需在Z-Library官网注册个人机器人。 ## 🔹 解绑Telegram账户 请通过官网个人资料页解绑。*注意:未绑定账户将导致机器人失效* —————— 📧 如有任何问题,请联系客服邮箱:support@z-lib.fm Zlibrary 图书下载 web 搜索 ISBN 搜索 作者搜索 书名搜索 出版社搜索 web 下载 免费用户每日可以在 Web 端下载 10 本电子书。不限制图书大小! web 线上阅读 最好的毛选版本 -> 《毛泽东选集》(毛选1-7:原版五卷+静火+赤旗+草堂) TG Bot 下载 在TG Bot 中,免费用户每日可以下载 20 本电子书!现在图书大小 50 MB 以下。所以大的电子书,web 下载,小的电子书 TG Bot 下载是最佳选择。 书名,作者名,ISBN,等方式都支持。 ISBN 号下载 最推荐的方法 发送一个 ISBN 你可以找到各种不同的版本 有 ISBN 号建议直接发送isbn号,没有再发送书籍名称,使用TG机器人下载比直接从浏览器下载更稳定,方便。可以从浏览器版本找书,在TG Bot中下载书籍,然后使用Calibre 刮削管理下载的书籍。 Calibre ISBN 刮削 注意冒号为英文字符 isbn:9787302518426 只需要一个准确的 ISBN 号,其它信息都可以不填,就可以准确的刮削图书! Zlibrary 书单 一个整理好的书单,可以极大的节约你的时间,扩展你的眼界! 下面是书单相关介绍和推荐。 公开专栏 你可以在这里找到广受好评的书单。 最喜欢的书单 在公开专栏中收藏的书单在这里显示! Zlibrary 书单推荐 下面推荐几个作者认为很好的书单介绍给大家! 计算机系列丛书 数学 英语学习 数学系列丛书 机器视觉 系列教程 全部文章RSS订阅 图书、音乐、视频多媒体锦集 Nas RSS分类订阅 视频图书和音乐完全自动化管理框架图解 如何建立自己的私人电子图书馆–出版书籍,网络小说,漫画一网打尽! Zlibrary 图书资源下载与 Calibre 图书管理打造结构化电子图书馆高阶教程 如何使用media Go,MusicBrainz,Mp3tag工具刮削音乐 整理音乐资料库 私人在线音乐服务器搭建与使用介绍 如何使用tinyMediaManager刮削电影和电视剧,动画,并自动下载字幕 使用jeckett,sonarr,iyuu,qt,emby打造全自动追剧流程 hexo博客博文撰写篇之完美笔记大攻略终极完全版 Nas系列 Nas 分类 RSS 订阅 从零开始玩PT-入门到精通 如何建立自己的私人电子图书馆–出版书籍,网络小说,漫画一网打尽! Zlibrary 图书资源下载与 Calibre 图书管理打造结构化电子图书馆高阶教程 音视频图书和音乐自动化管理框架图解 使用jeckett,sonarr,iyuu,qt,emby打造全自动追剧流程 如何使用tinyMediaManager刮削电影和电视剧,动画,并自动下载字幕 Potplayer终极优化教程实现PC视频播放最强画质 Transmission 使用及其配置 Qbittorrent 参数详细设置教程 IPFS从零开始快速入门教程 家庭网络优化指南:提升NAT类型,降低游戏延迟、提高下载速度 内网域名管理+DNS加速+DNS去广告+魔法上网的终极系统 如何创建属于自己的私人资料库与私人搜索引擎 PT 工具集,Linux硬链接助手 QNAP 修改应用启动顺序 qnap硬盘移动位置 qnap IO 错误消除 Docker系列 Docker 分类 RSS 订阅 Docker使用简明教程 使用jeckett,sonarr,iyuu,qt,emby打造全自动追剧流程 为知笔记私有化Docker部署 Earthly 一个更加强大的镜像构建工具 使用 Shell 脚本实现一个简单 Docker 如何使用Traefik V2 在Ubuntu20.04 上面来做 Dockers 通过IPV6访问Qnap NAS中Docker的服务

2025/9/5
articleCard.readMore