6月3日数据库学习笔记
一、分布式数据库系统
(一)分布式数据库的概念
分布式数据库系统是由多台计算机组成的网络中的多个数据库组成的一个逻辑整体。这些数据库分布在不同的地理位置,但用户可以像访问本地数据库一样访问整个系统,而无需关心数据的实际存储位置。
(二)分布式数据库的优势
高可用性:即使部分节点发生故障,系统仍然能够继续提供服务,因为数据在多个节点上有副本。
可扩展性:可以通过增加新的节点来扩展系统的处理能力和存储容量。
性能提升:查询和更新操作可以并行执行,提高系统性能。
灵活性:可以根据业务需求灵活地添加或删除节点。
(三)分布式数据库的挑战
数据一致性:在分布式环境中,确保数据在多个节点上的一致性是一个挑战。通常采用一致性协议如两阶段提交(2PC)或 Paxos 算法。
网络延迟:节点之间的网络通信可能会引入延迟,影响系统性能。
故障处理:需要设计复杂的机制来检测和处理节点故障。
事务管理:分布式事务的管理比集中式事务更加复杂,需要考虑事务的提交和回滚策略。
二、数据库中间件
(一)数据库中间件的概念
数据库中间件是一种软件层,位于客户端应用和数据库服务器之间,用于简化数据库访问和管理。它提供了统一的接口,使应用能够更方便地与不同的数据库进行交互。
(二)常见数据库中间件
MyBatis
特点:MyBatis 是一个优秀的持久层框架,支持自定义 SQL 和存储过程,提供映射器(Mapper)机制,将 Java 对象与数据库表进行映射。
应用场景:适用于需要灵活操作数据库的场景,如复杂的查询和更新操作。
示例代码:
java
复制
@Mapper
public interface UserMapper {
@Select("SELECT * FROM users WHERE id = #{id}")
User findById(Long id);
}
Hibernate
特点:Hibernate 是一个对象关系映射(ORM)框架,提供了对象与关系型数据库之间的映射功能,支持事务管理、连接池等功能。
应用场景:适用于需要快速开发和维护的场景,减少重复的 SQL 编写工作。
示例代码:
java
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private int age;
}
ShardingSphere
特点:ShardingSphere 是一个数据库中间件,支持分布式数据库的分片、读写分离、事务管理等功能。
应用场景:适用于大数据量、高并发的场景,如电商、金融等行业。
示例配置:
yaml
datasource:
ds0:
url: jdbc:mysql://localhost:3306/ds0
username: root
password: root
ds1:
url: jdbc:mysql://localhost:3306/ds1
username: root
password: root
sharding:
tables:
user:
actual-data-nodes: ds${0..1}.user
key-generator:
column: id
type: SNOWFLAKE
三、数据库备份与恢复策略
(一)备份策略
全量备份:备份整个数据库的所有数据,包括表结构、数据、索引等。全量备份通常定期进行,如每周一次。
增量备份:备份自上次备份以来发生变化的数据。增量备份可以减少备份时间,但恢复时需要结合全量备份和多个增量备份。
差异备份:备份自上次全量备份以来发生变化的数据。差异备份比增量备份恢复速度快,但备份文件通常较大。
(二)恢复策略
时间点恢复:将数据库恢复到指定的时间点。这对于处理数据误操作或系统故障非常有用。
完整恢复:将数据库恢复到最后一次备份时的状态。适用于数据库完全损坏的情况。
部分恢复:仅恢复数据库中的部分表或数据。适用于某些表或数据损坏的情况。
(三)备份与恢复工具
MySQL
备份工具:mysqldump 是一个常用的备份工具,可以生成 SQL 脚本文件,用于恢复数据库。
bash
mysqldump -u root -p mydatabase > backup.sql
恢复工具:使用 mysql 命令恢复备份数据。
bash
mysql -u root -p mydatabase < backup.sql
PostgreSQL
备份工具:pg_dump 是 PostgreSQL 的备份工具,可以生成 SQL 脚本文件或自定义格式的备份文件。
bash
pg_dump -U postgres mydatabase > backup.sql
恢复工具:使用 psql 命令恢复备份数据。
bash
psql -U postgres mydatabase < backup.sql
四、数据库的调优与监控
(一)调优方法
查询调优
分析查询计划:使用 EXPLAIN 分析 SQL 语句的执行计划,找出性能瓶颈。
sql
EXPLAIN SELECT * FROM users WHERE age > 25;
优化查询语句:避免使用 SELECT *,只查询需要的列;使用索引列作为查询条件。
sql
SELECT name, email FROM users WHERE age > 25;
索引调优
定期重建索引:随着数据的不断更新,索引可能会变得碎片化,影响查询性能。定期重建索引可以优化索引结构。
sql
ALTER INDEX idx_age ON users REBUILD;
避免索引失效:某些查询条件可能导致索引失效,如使用函数或通配符开头的查询。应避免这些写法。
sql
SELECT * FROM users WHERE age = 25; -- 使用索引
SELECT * FROM users WHERE UPPER(name) = 'ALICE'; -- 索引失效
连接池调优
合理设置连接池参数:根据实际业务负载,设置连接池的最大连接数、最小空闲连接数等参数。
java
HikariConfig config = new HikariConfig();
config.setMaximumPoolSize(20);
config.setMinimumIdle(5);
(二)监控工具
MySQL
性能分析工具:SHOW PROCESSLIST 查看当前正在执行的 SQL 语句;SHOW STATUS 查看数据库性能指标。
sql
SHOW PROCESSLIST;
SHOW STATUS LIKE 'Qcache%';
慢查询日志:记录执行时间超过阈值的 SQL 语句,用于发现性能瓶颈。
sql
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 2;
PostgreSQL
性能分析工具:pg_stat_activity 查看当前活动的会话;pg_stat_database 查看数据库级别的性能指标。
sql
SELECT * FROM pg_stat_activity;
SELECT * FROM pg_stat_database;
慢查询日志:通过配置 log_min_duration_statement 参数记录慢查询。
sql
SET log_min_duration_statement = 2000; -- 记录执行时间超过 2 秒的 SQL 语句
浙公网安备 33010602011771号