数据库:SQLite/MySQL/PostgreSQL 的破圈之战

news/2025/3/18 8:48:14/文章来源:https://www.cnblogs.com/strivegys/p/18778189

# 数据库类型对比

| 维度 | SQLite | MySQL | PostgreSQL |
| --- | --- | --- | --- |
| 类型 | 嵌入式数据库 | 关系型数据库管理系统 (RDBMS) | 对象-关系型数据库 (ORDBMS) |
| 架构 | 无服务端,单文件存储 | 客户端-服务器架构 | 客户端-服务器架构 |
| 事务支持 | ACID 兼容(默认启用) | ACID 兼容(需使用 InnoDB 引擎) | 完整 ACID 兼容 |
| 并发处理 | 写操作全局锁 | 行级锁 + MVCC (InnoDB) | 多版本并发控制 (MVCC) |
| 扩展性 | 单机,适合轻量级应用 | 支持主从复制、分片 | 支持复杂复制、并行查询 |
| 典型应用场景 | 移动应用、小型工具、本地缓存 | 中小型 Web 应用 | 复杂查询、地理空间数据、大数据 |

## SQLite

### 安装与配置

#### 无需独立安装 (多数编程语言内置支持)

```python
import sqlite3 # Python
```

#### 创建/连接数据库

```python
import sqlite3

# 连接数据库(不存在则创建)
conn = sqlite3.connect('mydatabase.db')
cursor = conn.cursor()
```

### 核心操作

#### 表操作

```python
-- 创建表
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT UNIQUE,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

-- 删除表
DROP TABLE IF EXISTS users;
```
#### 数据操作

```
-- 插入数据
INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com');

-- 查询数据
SELECT * FROM users WHERE name LIKE 'A%';

-- 更新数据
UPDATE users SET email = 'new@example.com' WHERE id = 1;

-- 删除数据
DELETE FROM users WHERE id = 2;
```
#### 事务操作

```
try:
cursor.execute("BEGIN TRANSACTION")
cursor.execute("INSERT INTO logs (message) VALUES ('Operation start')")
cursor.execute("COMMIT")
except sqlite3.Error as e:
cursor.execute("ROLLBACK")
print(f"Transaction failed: {e}")
```

### 性能优化

#### 启用 WAL 模式

```
PRAGMA journal_mode = WAL; -- 提升并发读性能
```

#### 调整缓存大小

```
PRAGMA cache_size = -10000; -- 设置10MB缓存
```
#### 批量插入优化

```
# 使用 executemany 和事务
data = [('Bob', 'bob@test.com'), ('Charlie', 'charlie@test.com')]
cursor.execute("BEGIN TRANSACTION")
cursor.executemany("INSERT INTO users (name, email) VALUES (?, ?)", data)
cursor.execute("COMMIT")
```

## MySQL

### 安装与配置

#### ububtu 系统

```
sudo apt update
sudo apt install mysql-server
sudo mysql_secure_installation # 安全配置(设置 root 密码、移除匿名用户等)
```

#### 配置文件路径:

```
Linux: /etc/mysql/my.cnf 或 /etc/my.cnf
Windows: C:\ProgramData\MySQL\MySQL Server X.X\my.ini
```
#### 修改字符集为 UTF-8:

```
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
```
#### 创建用户
```
CREATE USER 'app_user'@'192.168.1.1' IDENTIFIED BY 'your_password';
```
#### 授予权限
```
-- 授予所有数据库的读写权限
GRANT ALL PRIVILEGES ON *.* TO 'app_user'@'%' WITH GRANT OPTION;

-- 授予特定数据库权限
GRANT SELECT, INSERT, UPDATE ON mydb.* TO 'app_user'@'localhost';

-- 刷新权限
FLUSH PRIVILEGES;
```

### 核心操作

#### 数据库操作

```
-- 创建数据库
CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 切换DB
USE mydb;
```

#### 表操作


```
-- 创建表
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 查看表结构
DESCRIBE users;
```

#### 数据操作

```
-- 插入数据
INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com');
-- 模糊查询
SELECT * FROM users WHERE name LIKE 'A%';
-- 更新数据
UPDATE users SET email = 'new@example.com' WHERE id = 1;
-- 删除数据
DELETE FROM users WHERE id = 2;
```

#### 事务管理

```
START TRANSACTION;
INSERT INTO orders (user_id, amount) VALUES (1, 100);
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
COMMIT; -- 提交事务

-- 发生错误时回滚
ROLLBACK;
```

### 备份与恢复

#### 逻辑备份
```
-- 导出全部数据库
mysqldump -u root -p --all-databases > full_backup.sql
-- 导出单个数据库
mysqldump -u root -p mydb > mydb_backup.sql
```
#### 物理备份

```
xtrabackup --backup --user=root --password=your_password --target-dir=/backup/
```

#### 自动备份(cron任务)

```
# 每天凌晨 2 点备份
0 2 * * * /usr/bin/mysqldump -u root -p'password' mydb > /backup/mydb_$(date +\%F).sql
```


## 日常问题

#### 如何处理死锁(Deadlock)?

- **查看死锁日志:**

```
SHOW ENGINE INNODB STATUS; -- 查看 LATEST DETECTED DEADLOCK 部分
```

- **优化事务逻辑:**

. 按固定顺序访问表

. 减少事务执行时间

- **重试机制:**

```
# Python 示例
import mysql.connector
from mysql.connector import errors

try:
cursor.execute("UPDATE accounts SET balance = balance - 100 WHERE user_id = 1")
except errors.DatabaseError as e:
if 'Deadlock' in str(e):
print("检测到死锁,正在重试...")
# 重试逻辑
```


## PostgreSQL

### 安装与配置

#### ububtu系统

```
sudo apt update
sudo apt install postgresql postgresql-contrib # 包含扩展组件
sudo systemctl start postgresql
sudo systemctl enable postgresql
```

#### 配置文件路径:

```
主配置文件: /etc/postgresql/<version>/main/postgresql.conf

访问控制文件: /etc/postgresql/<version>/main/pg_hba.conf
```
#### 允许远程访问:

```
-- 修改 postgresql.conf:
listen_addresses = '*' # 允许所有IP
-- 修改 pg_hba.conf:
host all all 0.0.0.0/0 md5
-- 重启服务
sudo systemctl restart postgresql
```
#### 创建用户与数据库:
```
sudo -u postgres psql
CREATE USER app_user WITH PASSWORD 'your_password';
CREATE DATABASE mydb OWNER app_user;
```

#### 授予权限:

```
GRANT ALL PRIVILEGES ON DATABASE mydb TO app_user;
GRANT SELECT, INSERT ON my_table TO app_user;
```

### 核心操作

#### 数据库操作

- **连接数据库**

```
psql -U app_user -d mydb -h 127.0.0.1
```

- **创建表**

```
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(50) NOT NULL,
profile JSONB,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```

- **查看表结构**


```
\d+ users -- 查看表详情
```

#### 数据操作

- **插入数据:**

```
INSERT INTO users (name, profile)
VALUES ('Alice', '{"age": 30, "role": "admin"}');
```

- **查询 JSON 字段:**

```
SELECT name, profile->>'role' AS role
FROM users
WHERE profile @> '{"role": "admin"}';
```

- **事务管理:**

```
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
INSERT INTO transactions (user_id, amount) VALUES (1, -100);
COMMIT;
```

## 日常问题

#### 如何处理大表性能问题?

- **分区表**

```
CREATE TABLE logs_partitioned (
log_date DATE,
message TEXT
) PARTITION BY RANGE (log_date);

CREATE TABLE logs_2023 PARTITION OF logs_partitioned
FOR VALUES FROM ('2023-01-01') TO ('2024-01-01');
```

- **使用 BRIN 索引:**

```
CREATE INDEX idx_logs_time ON logs USING brin (log_time);
```

##### 本地AI知识库搭建, 你感兴趣么 ?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/900776.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【2025年企业必看】跨网文件传输难题如何破解?适合IT运维的解决方案

一、哪些行业会面临跨网文件传输场景 跨网文件传输的需求广泛存在于多个行业和企业机构中,以下是一些典型的行业和机构: 1、金融行业 银行:内部不同网域和部门之间、不同分支机构之间需要共享客户数据、交易记录等。 保险公司:总部与各地分公司之间需要传输保单、理赔数据等…

20250318

1. 20号胶 准备迎来建仓机会

UML之泛化用例

UML用例可以泛化,泛化可简化模型、避免重复、易于扩展。通过抽象用例实现复用和模块化。讨论参与者及用例之间的泛化关系,指出不使用泛化可能导致模型复杂和重复工作的问题。在UML中,参与者和用例都可以被泛化或特化,它们在泛化或特化时遵循面向对象中泛化与特化的特性。 用…

01. Linux系统编程入门

入门系统编程,首先理解一下基本的系统调用和库函数的区别 一切皆文件的思想,都是通过文件描述符来进行操作 strace命令文件读写系统调用 #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>int main (void) {in…

Macbook pro 打开pgAmin报错

当我们安装完postgresql,打开自带的pgAdmin时会报如下错误,这时候我需要去单独下载一个版本pgAdmin重新安装 下载地址:https://www.pgadmin.org/download/pgadmin-4-macos/

读DAMA数据管理知识体系指南23数据集成概念(上)

读DAMA数据管理知识体系指南23数据集成概念(上)1. 数据集成和互操作 1.1. 数据集成和互操作(DII)描述了数据在不同数据存储、应用程序和组织这三者内部和之间进行移动和整合的相关过程 1.2. 数据集成是将数据整合成物理的或虚拟的一致格式 1.3. 数据互操作是多个系统之间进行…

02. log WriteBatch 的结构和编码

在这样的情况之下,我就想来捋一下,这个代码的逻辑 首先从不同的模块说起吧include/leveldb : 这里面存储了要暴露给外部的API,这里面的结构,从使用者来说会比较熟悉,就是通过这里面的结构,实现它的功能,对不同的组件会有一个直观的定义 db : 这里面是对应的实现的类,不…

01. 非阻塞的Skiplist

首先学习LevelDB当中比较独立的一部分,当然的,读源码的话,一个很好的入门的感觉就是先从一个独立的组件模块开始,一个比较容易的开始,SkipList 然后跳表的基本概念什么的我不太想要去过多的赘述,就像二叉树那样希望能得到log(N)的性能,而又利用概率算法更好实现,可以看…

ROCm技术小结与回顾(下)

示例3–V_MFMA_F64_4x4x4F64 考虑V_MFMA_F64_4x4x4F64指令,它计算大小为44的四个独立矩阵块的MFMA。执行的操作是 ,其中 , , 和 都是大小为44元素的矩阵,N=0,1,2,3。下面的两张图显示了 1)输入参数A和B的四个分量的大小和形状,如图4-18所示。 2)分量映射到波阵面所拥有…

ROCm技术小结与回顾(上)

ROCm技术小结与回顾 在这一部分中,首先检查了Kernel 5在各种AMD GPU和问题大小上的性能,并注意到当网格超过一定大小阈值时,性能似乎会急剧下降。通过实验确定,LLC的大小是大型xy平面问题性能的限制因素。提出了两种不同的解决方法来规避缓存大小的问题,这两种方法都只需要…

有限差分法——拉普拉斯第4部分

有限差分法——拉普拉斯第4部分 提出了拉普拉斯算子有限差分法的HIP实现,并应用了四种不同的优化。在这些代码修改过程中,观察到由于全局内存的总取数减少,性能得到了逐步提高。然后,应用了进一步的优化,以在512512512上达到预期的性能目标MI250X GPU的单个GCD上的512个点…

推荐几本书1《AI芯片开发核心技术详解》、2《智能汽车传感器:原理设计应用》、3《TVM编译器原理与实践》、4《LLVM编译器原理与实践》,谢谢

4本书推荐《AI芯片开发核心技术详解》、《智能汽车传感器:原理设计应用》、《TVM编译器原理与实践》、《LLVM编译器原理与实践》由清华大学出版社资深编辑赵佳霓老师策划编辑的新书《AI芯片开发核心技术详解》已经出版,京东、淘宝天猫、当当等网上,相应陆陆续续可以购买。该…