MariaDB 入门教程
MariaDB 入门教程是开发者需要掌握的知识点。本文从基础概念开始结合实际案例详细讲解帮助读者深入理解并应用到实际开发中。
MariaDB 常见问题
MariaDB 常见问题是开发者需要掌握的知识点。本文从基础概念开始结合实际案例详细讲解帮助读者深入理解并应用到实际开发中。
MariaDB 配置方法
MariaDB 配置方法是开发者需要掌握的知识点。本文从基础概念开始结合实际案例详细讲解帮助读者深入理解并应用到实际开发中。
DuckDB 嵌入式 OLAP 分析
DuckDB 是嵌入式 OLAP 数据库列式存储和向量化执行。一行代码嵌入 Python。分析 CSV Parquet 等文件。本文用 DuckDB 分析数据集不需要数据库服务。
rqlite 轻量分布式 SQLite
rqlite 用 Raft 共识复制 SQLite 写入支持自动选举和故障转移。读写分离 Leader 处理写入。适合不需要 PostgreSQL 的轻量分布式存储。本文部署 rqlite 集群。
MariaDB 实战指南
MariaDB 实战指南是开发者需要掌握的知识点。本文从基础概念开始结合实际案例详细讲解帮助读者深入理解并应用到实际开发中。
MariaDB 优化技巧
MariaDB 优化技巧是开发者需要掌握的知识点。本文从基础概念开始结合实际案例详细讲解帮助读者深入理解并应用到实际开发中。
InnoDB 缓冲池 Buffer Pool 优化
InnoDB Buffer Pool 缓存数据和索引在内存中。LRU 列表淘汰老页面。多实例优化并发。本文配置和监控 Buffer Pool 命中率。
WAL-G PostgreSQL 物理备份
WAL-G 是 PostgreSQL 的物理备份工具支持增量备份和即时恢复。WAL 归档持续保护。压缩加密。本文配置 WAL-G 备份到 S3。
Materialized Path 树形结构
MySQL/PostgreSQL 中存树形数据可以用 Materialized Path 在每行存从根到当前的路径。一个字段快速查子树和祖先。本文存评论树结构。
DBeaver 数据库管理工具
DBeaver 数据库管理工具是开发中常用的技术工具或方法。本文从实际应用出发介绍核心概念和操作步骤帮助读者快速上手并掌握关键技巧。
FoundationDB 分布式数据库
FoundationDB 是 Apple 的分布式数据库层键值存储支持 ACID 事务。分层架构上层构建文档和图模型。适合对一致性要求高的场景。本文部署 FoundationDB 集群。
Apache Cassandra 二级索引
Cassandra 二级索引适用低基数查询。ALLOW FILTERING 性能差。SASI 和 SAI 索引改进。高基数查询需要物化视图。本文设计 Cassandra 数据模型避免索引。
Google Spanner 全球分布式数据库
Google Spanner 是全球分布式 SQL 数据库 TrueTime API 保证外部一致性。全球强一致和水平扩展。本文解释 Spanner 的架构打破 CAP 定理。
SQLite WAL 模式写入性能
SQLite WAL 模式允许读和写同时进行不会阻塞。WAL 文件替代 rollback journal。批量写入合并减少 fsync。本文对比 WAL 和传统日志的写入性能。
MongoDB Change Streams 订阅变更
MongoDB Change Streams 监听集合的 INSERT/UPDATE/REPLACE 事件返回变更数据。基于 oplog。适合实时同步和通知。本文监听订单集合变更触发通知。
PostGIS 地理空间查询
PostGIS 扩展 PostgreSQL 支持地理数据存储和空间查询。ST_Distance/ST_Intersects 空间函数。GIST 索引加速。本文查附近 POI 的 SQL 查询。
Cassandra 宽行存储和 CQL 查询
Cassandra 是宽列 NoSQL 数据库分区键决定数据分布。CQL 类似 SQL 但不支持 JOIN。最终一致性可调。本文用 IoT 设备数据展示 Cassandra 的建模方式。
Sphinx 中文全文搜索引擎
Sphinx 独立搜索引擎中文需配置 mmseg 词库。索引速度远快于 MySQL LIKE。本文部署 Sphinx 搜索 MySQL 数据。
MongoDB 聚合管道中的 $lookup 关联查询
MongoDB 的 $lookup 实现类似 SQL JOIN 的关联查询。from 指定关联集合localField/foreignField 关联字段。本文用订单和用户集合展示 $lookup 的使用。
N+1 查询问题的检测和优化
N+1 查询指查询主表时每条记录又触发一次查询子表。ORM 的 Lazy Loading 是常见原因。Eager Loading 加 IN 查询和批量加载可以解决。本文用 ORM 代码展示优化前后。
事务隔离级别 MVCC 原理
MVCC 通过保留数据的多个版本来实现不同隔离级别。快照读不加锁。事务 ID 决定可见性。本文用 INSERT/UPDATE 操作解释 MVCC 的版本链机制。
SQL Server 索引碎片整理
SQL Server 索引碎片率高影响查询性能。碎片率低于 30% 用重组高于 30% 用重建。fillfactor 留空余减少碎片。本文介绍碎片监控和整理方法。
图数据库 Neo4j 的基本概念和查询
Neo4j 用图结构存储数据节点表示实体关系表示连接。Cypher 是 Neo4j 的查询语言类似 SQL 但为图结构设计。本文介绍节点关系的基本创建和查询操作。
PostgreSQL 中 ORDER BY 使用 CASE 自定义排序
ORDER BY CASE status WHEN active THEN 1 WHEN pending THEN 2 END 按自定义顺序排序而不按字母或数字顺序。适合状态和优先级排序。
MySQL 中 IN 和 EXISTS 的性能选择
外层表小内层表大时 IN 更优。外层表大内层表小时 EXISTS 更优。MySQL 优化器可能会重写两者实际执行计划可能相同。
MySQL 中 ANALYZE TABLE 更新统计信息
ANALYZE TABLE 更新表的统计信息让优化器生成更准确的执行计划。大量数据变更后手动 ANALYZE 可以改善查询性能。InnoDB 自动 analyze 的频率较低。
PostgreSQL 中的 COPY 命令快速导入导出
COPY table FROM file WITH CSV HEADER 从 CSV 文件快速导入比 INSERT 快几十倍。COPY table TO file 导出。适合大数据量的导入导出。
MySQL 中死锁的定位和排查
SHOW ENGINE INNODB STATUS 输出的 LATEST DETECTED DEADLOCK 部分包含死锁信息和涉及的事务 SQL。分析两个事务的锁请求顺序可以避免死锁。
PostgreSQL 中的 pg_dump 和 pg_restore 备份恢复
pg_dump db > backup.sql 导出 SQL 格式备份。pg_restore -d db backup.dump 恢复。--format=custom 自定义格式支持并行恢复。
MySQL 中 AUTO_INCREMENT 的步长和起始值
auto_increment_increment 设置步长auto_increment_offset 设置起始值。主主复制中设置不同步长避免自增 ID 冲突。
PostgreSQL 中的 SERIAL 和 IDENTITY 自增
SERIAL 是 PostgreSQL 传统的自增方式。IDENTITY 是 SQL 标准自增语法支持 GENERATED ALWAYS 和 BY DEFAULT。新项目推荐用 IDENTITY。
PostgreSQL 中的 EXPLAIN 输出解读
Seq Scan 全表扫描Index Scan 索引扫描。rows 预计行数actual time 实际耗时。代价从小到大选择最优执行计划。本文解读 EXPLAIN 输出各字段含义。
MySQL 中 INSERT IGNORE 和 INSERT ON DUPLICATE
INSERT IGNORE 冲突时忽略不插入不报错。INSERT ON DUPLICATE KEY UPDATE 冲突时更新。INSERT IGNORE 不会产生错误日志适合批量导入。
MySQL 中的虚拟列 Generated Column
MySQL 的虚拟列从其他列自动计算得出。VIRTUAL 不存储STORED 存储到磁盘。生成列上可以建索引为 JSON 字段创建函数索引。
PostgreSQL 中 LATERAL JOIN 横向关联
LATERAL 允许子查询引用前面表的字段。FROM table1, LATERAL (SELECT * FROM table2 WHERE id = table1.id) 实现行关联的子查询。
MySQL 中行锁和表锁的区别
InnoDB 的行锁只锁定需要修改的行高并发下性能好。MyISAM 的表锁锁定整个表写入会阻塞其他读写。InnoDB 的行锁基于索引如果 WHERE 没走索引会升级为表锁。
PostgreSQL 中 PREPARE 和 EXECUTE 预编译语句
PREPARE plan_name AS sql 预编译 SQL 语句EXECUTE plan_name(values) 执行。减少 SQL 解析和优化耗时适合高频执行的相同查询。
MySQL 中的外键约束使用场景
外键约束保证引用完整性删除时 CASCADE 或 SET NULL。但在高并发场景下外键会增加锁开销。很多互联网公司选择在应用层保证引用关系。
MySQL WHERE 条件的执行顺序不影响结果
WHERE 条件的执行顺序不保证从左到右优化器会基于统计信息选择最优顺序。不需要把索引条件放在前面。MySQL 的 WHERE 顺序不影响性能。
PostgreSQL 中的 VIEW 视图和 MATERIALIZED VIEW
普通 VIEW 每次查询都重新执行底层 SQL。MATERIALIZED VIEW 将结果物化到磁盘需要 REFRESH 更新。适合计算量大的报表查询。
MySQL UPDATE JOIN 关联更新
UPDATE t1 JOIN t2 ON condition SET t1.col = t2.col 根据另一张表的值更新当前表。比子查询 UPDATE 更高效。本文展示 UPDATE JOIN 的语法。
PostgreSQL 中 DISTINCT ON 的用法
DISTINCT ON (column) 对指定列去重保留 ORDER BY 排序的第一行。比 GROUP BY 更灵活不用聚合函数。本文用每个用户最新订单的例子展示。
MySQL 中自增 ID 不连续的原因
MySQL 自增 ID 不连续的原因包括事务回滚和 insert ignore 跳过重复键。InnoDB 不保证自增值连续只保证递增。本文列出各种跳号场景。
MySQL 中分区表的使用场景
分区表把一张大表按逻辑拆成多个物理分区查询时只扫描匹配分区的数据。适合按时间范围清理历史数据的场景。本文展示 RANGE 分区的定义和查询优化。
PostgreSQL 中 UPSERT 的 ON CONFLICT
INSERT INTO ... ON CONFLICT (id) DO UPDATE SET ... 实现有则更新无则插入。DO NOTHING 跳过冲突行。本文展示 UPSERT 的完整语法。
MySQL 中 REPLACE INTO 和 INSERT ON DUPLICATE KEY UPDATE
REPLACE INTO 冲突时先删除再插入改变自增 ID。INSERT ON DUPLICATE KEY UPDATE 冲突时直接更新不删除。本文对比两种 upsert 方式的行为差异。
PostgreSQL 中的 GENERATED 列自动计算
GENERATED ALWAYS AS (表达式) STORED 创建自动计算列值不需要手动更新。适合价格乘以数量等于总价这类场景。本文展示 GENERATED 列的创建和使用。
MySQL 大表 DDL 操作导致锁表
MySQL 的大表 ALTER TABLE 会锁住整个表阻塞读写。用 pt-online-schema-change 或 MySQL 8.0 的在线 DDL 可以避免锁表。本文介绍在线变更工具的使用。
MySQL 5.7 升 8.0 后默认字符集变了
MySQL 8.0 将默认字符集从 latin1 改成 utf8mb4升级后已有表的字符集不变但新创建的表和库使用新默认值。本文列出升级后需要检查的地方。
PostgreSQL 递归查询 WITH RECURSIVE
WITH RECURSIVE 实现递归查询可以处理树形和层级结构的数据。递归 CTE 包含一个基准查询和一个递归查询。本文用组织架构树展示递归查询的写法。
MySQL 字符集 utf8mb4 和 utf8 的区别
MySQL 的 utf8 只支持最多 3 字节的字符存不了 emoji。utf8mb4 支持完整的 Unicode 包括 4 字节字符。新项目应该用 utf8mb4 作为默认字符集。
PostgreSQL 的 RETURNING 子句返回操作后的数据
PostgreSQL 的 INSERT/UPDATE/DELETE 后加 RETURNING * 直接返回操作后的行数据不需要再查一次 SELECT。本文展示 RETURNING 的多种实际场景。
MySQL IN 子查询性能差改 JOIN
WHERE id IN (SELECT id FROM other) 在 MySQL 中可能比等效的 JOIN 慢因为子查询物化了中间结果。改成 JOIN 形式让优化器更好地选择执行计划。
MySQL 隐式类型转换导致索引失效
WHERE string_col = 123 字符串列和数字比较时 MySQL 把字符串转成数字导致索引失效。改成 '123' 字符串形式可以走索引。本文用 EXPLAIN 展示转换前后的差异。
MySQL 时间列上 ORDER BY 不走索引的可能原因
WHERE DATE(create_time) = today 在时间列上用了函数索引失效导致 ORDER BY 也不走索引。改写为 create_time >= today AND create_time < tomorrow 可以走索引。
PostgreSQL 中窗口函数 row_number rank dense_rank
窗口函数在不改变行数的情况下为每行计算排名。row_number 给唯一序号rank 并列跳过dense_rank 并列不跳过。本文用成绩排名示例对比三者的输出。
MySQL GROUP BY 和 HAVING 的过滤区别
WHERE 在分组前过滤行HAVING 在分组后过滤聚合结果。WHERE 可以用索引HAVING 不能。本文用商品统计的例子说明两者的使用场景。
MySQL 日期函数 NOW 和 SYSDATE 的区别
NOW() 在同一个 SQL 语句中返回相同时间SYSDATE() 每次调用都返回实时时间。在基于语句的复制中 NOW 是安全而 SYSDATE 可能导致主从不一致。
MySQL 删除数据后表文件大小不变
DELETE FROM 只标记行删除文件不会缩小。InnoDB 的 page 合并后空间可复用但不是释放给操作系统。要回收空间用 OPTIMIZE TABLE 或 ALTER TABLE ENGINE=InnoDB。