数据库——数据库性能优化
数据库优化
系统的吞吐量瓶颈往往出现在数据库的 访问速度 上,随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢,因为其数据是存放在 磁盘 上的,读写速度无法和内存相比,所以使用数据库时,十分有必要了解数据库优化问题。其优化原则为:减少系统瓶颈,减少资源占用,增加系统的反应速度。
数据库结构优化
优化目标:
减少数据冗余:确保相同的数据不会在多个地方重复存储,减少数据更新和维护的复杂性。
避免数据维护异常:包括插入异常、更新异常和删除异常,确保数据库操作的正确性和一致性。
节约存储空间:通过合理设计表结构和数据类型,减少不必要的存储空间浪费。
提高查询效率:优化表结构和索引,加快数据检索速度,提升系统性能。
优化策略:
在数据库设计中,针对字段很多或查询复杂的情况,采用表分解、增加中间表(以及合理添加冗余字段是常见的优化策略。
表分解(Normalization):
将大表分解成多个小表,每个表专注于一组相关的数据,通过外键关联。这有助于减少数据冗余,提高数据一致性,并使数据库结构更清晰。
增加中间表(Denormalization for Query Op ...
数据库——redis常见面试题
redis
Redis是一个高性能的、基于内存的Key-Value数据库,支持多种数据结构,如字符串、哈希、列表、集合和有序集合。它提供快速读写能力,常用于缓存、消息队列、会话管理等场景。Redis支持持久化,保障数据不丢失,同时支持高可用性和可扩展性,通过主从复制和集群部署实现。尽管内存大小有限,但Redis的高性能和灵活性使其成为互联网应用中不可或缺的一部分。
redis与mysql
Redis是一个高速的内存数据库,适用于需要快速访问的场景;而MySQL是一个功能强大的关系型数据库,适用于需要复杂查询和事务处理的应用程序。
类型与存储:
Redis:非关系型(NoSQL),主要基于内存存储,读写速度极快。
MySQL:关系型数据库(RDBMS),数据存储在磁盘上,支持复杂查询和事务处理。
数据持久化:
Redis:提供RDB和AOF两种机制,将数据从内存保存到磁盘以防止数据丢失。
MySQL:通过其存储引擎(如InnoDB)的日志和事务机制来保证数据的持久性。
数据结构:
Redis:支持多种数据结构,如字符串、哈希、列表、集合和有序集合。
MySQL:主要 ...
数据库——常用SQL语句
SQL语句
SQL(Structured Query Language)是一种用于访问和操作数据库系统的标准编程语言。它允许用户执行各种数据管理任务,如查询、更新、插入和删除数据库中的数据。以下是一些基本的SQL语句示例:
1. 创建数据库(Create Database)
1CREATE DATABASE myDatabase;
2. 创建表(Create Table)
123456CREATE TABLE students ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) NOT NULL, age INT, grade VARCHAR(50));
3. 插入数据(Insert)
12INSERT INTO students (name, age, grade) VALUES ('Alice', 20, 'A+');INSERT INTO students (name, age, grade) VALUES ('Bob', 22, ...
数据库——锁
锁
在数据库管理和并发编程中,锁(Locks)是一种重要的同步机制,用于控制多个用户对共享资源的访问,以避免数据的不一致性和冲突。锁的主要目的是确保在给定时间内,只有一个事务(或进程、线程)可以访问特定的数据或资源。
锁的类型
共享锁(Shared Locks, S锁):
允许多个事务同时读取同一资源,但禁止任何事务写入该资源。也称为读锁。
当事务对数据加上S锁后,其他事务可以继续加S锁,但如果其他事务想加排他锁(X锁)则必须等待该事务释放S锁。
排他锁(Exclusive Locks, X锁):
允许事务独占访问特定资源,即加锁期间既不允许其他事务读取,也不允许写入。也称为写锁。
当事务对数据加上X锁后,其他事务不能对其加任何类型的锁,直到该锁被释放。
意向锁(Intention Locks):
是一种特殊的表级锁,表示事务将来可能对表中的行加锁。意向锁分为意向共享锁(IS锁)和意向排他锁(IX锁)。
意向锁的主要目的是表明事务的锁定意向,以提高锁定的效率。例如,在添加行级X锁之前,需要先在表上加IX锁,这样其他事务在尝试对表加S锁或X锁时就可以快速判断是否有冲 ...
数据库——事务管理
事务管理
事务管理是对一系列数据库操作进行管理的过程,这些操作被视为一个不可分割的工作单元(原子单元)。事务管理在数据库系统中起着至关重要的作用,它确保了数据的一致性和完整性,防止了数据在并发操作中出现不一致或损坏的情况。
事务的定义
事务是数据库管理系统中的一个概念,用于管理一组数据库操作,使它们作为一个不可分割的工作单元执行。一个事务可以包含一个或多个SQL语句,这些语句要么全部执行成功,要么全部回滚(撤销),从而确保数据库的数据一致性和完整性。
事务的特性(ACID)
事务具有四个基本特性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),这四个特性通常简称为ACID。
原子性:事务是一个原子操作,由一系列动作组成。事务的原子性确保这些动作要么全部完成,要么完全不起作用,从而避免了部分成功、部分失败的情况。
一致性:事务必须使数据库从一个一致性状态转换到另一个一致性状态。这意味着事务的执行不会破坏数据库的约束和规则,确保数据的正确性。
隔离性:事务的隔离性确保了多个并发事务之间的隔离,避免了数据交叉访 ...
数据库——索引
数据库索引
数据库索引是数据库表中的一种数据结构,用于提高数据检索的效率。主要有以下五个特性:
提高检索速度:通过索引,数据库可以快速定位到数据,显著减少查询响应时间。
数据结构优化:通常采用B树或B+树结构,这些结构支持高效的数据插入、检索和排序。
唯一性约束:唯一索引确保数据项的唯一性,防止数据重复。
支持复合索引:允许基于表中多个列的组合创建索引,提高特定查询的效率。
维护成本:虽然索引可以加快查询速度,但它们也需要额外的存储空间,并且在数据更新时需要维护,这可能会影响性能。
索引优缺点
优点
缺点
显著减少查询响应时间,特别是对于大型数据集。
索引需要额外的存储空间,随着数据量的增加,需求也会增长。
索引通常是有序的,可以加快排序操作。
索引更新可能降低数据插入、更新或删除的性能。
使搜索操作更迅速,特别是范围查询和模糊查询。
索引的动态维护增加了数据库的维护成本。
唯一索引确保数据项的唯一性,防止数据重复。
需要深入了解查询模式和数据使用情况,设计有效的索引策略。对表结构的更改可能需要相应地更新索引。
加快表之间的连接操作 ...
数据库基础概念
数据库概念
数据库是一种存储、检索和管理数据的系统。它允许用户以结构化的方式存储数据,并且可以通过各种查询和操作来访问这些数据。
数据库基本特征:
结构化:数据库中的数据通常是以表格(表)的形式存储的,每张表由行(记录)和列(字段)组成。
持久性:数据库中的数据是持久存储的,即使系统关闭,数据也不会丢失。
组织性:数据在数据库中是有序存储的,便于快速检索和更新。
安全性:数据库管理系统提供了多种安全措施,如用户认证、权限控制等,以保护数据不被未授权访问。
并发控制:数据库能够处理多个用户同时访问和修改数据的情况,确保数据的一致性和完整性。
数据完整性:数据库通过各种约束(如主键、外键、唯一性约束等)来维护数据的准确性和可靠性。
灵活性:用户可以通过SQL(结构化查询语言)等查询语言来执行复杂的数据操作。
可扩展性:数据库系统通常可以随着数据量的增加而扩展,以适应不断增长的存储和处理需求。
两种数据库
关系型数据库:使用表格模型来组织数据,数据之间通过关系(如外键)相互关联。常见的关系型数据库有MySQL、PostgreSQL、Oracle和SQL Server等。
非关系型 ...
C++常见设计模式
设计模式
设计模式(Design Patterns)是软件开发人员在软件设计过程中面临的一般问题的解决方案。它们不是直接用来完成工作的代码或“完成品”,而是描述如何组织代码和对象,以及它们之间的交互和职责分配的一种抽象方式。设计模式使得代码更加灵活、可重用、易于理解和维护。
设计模式的六大原则
单一职责原则(SRP):一个类负责一项职责。
开闭原则(OCP):软件应对扩展开放,对修改关闭。
里氏替换原则(LSP):子类可以替换父类且功能不受影响。
依赖倒置原则(DIP):高层模块不应依赖低层模块,而应依赖抽象。
接口隔离原则(ISP):使用多个小接口比单一大接口好。
迪米特法则(LoD):一个类应尽量少地了解其他类。
单例模式
单例模式(Singleton Pattern)是一种常用的软件设计模式,用于确保一个类仅有一个实例,并提供一个全局访问点来获取这个唯一实例。这种模式在需要控制资源访问,如数据库连接、文件句柄或者需要确保配置信息的全局唯一性等场景下非常有用。
在C++中,单例模式(Singleton Pattern)是一种确保一个类仅有一个实例,并提供一个全局访问点来获取该实 ...
C++I/O进程技术
C++条件变量
C++中的条件变量(Condition Variable)是一种同步原语,用于在多线程程序中阻塞一个或多个线程,直到收到另一个线程的通知。条件变量通常与互斥锁(Mutex)一起使用,以确保在访问共享数据时线程之间的同步。
基本概念
互斥锁(Mutex):用于保护共享数据,防止多个线程同时访问造成数据竞争。
条件变量(Condition Variable):用于等待某个条件成立。当条件不满足时,线程会阻塞在条件变量上,等待其他线程修改条件并通知(notify)条件变量。
使用条件变量的步骤
创建互斥锁和条件变量:在需要同步的共享数据附近创建互斥锁和条件变量。
加锁:在访问共享数据或等待条件变量之前,先对互斥锁加锁。
等待条件变量:如果条件不满足,则调用条件变量的等待函数(如wait、wait_for、wait_until),这会使当前线程阻塞并释放互斥锁,直到其他线程调用条件变量的通知函数(notify_one或notify_all)唤醒它。
被唤醒后重新加锁:当线程被唤醒后,会自动重新对互斥锁加锁,然后再次检查条件是否满足。
解锁:在访问完共享数据后,对互斥锁进行 ...
C++语言特性相关
左值和右值
左值和右值是C/C++编程语言中的两个重要概念,它们在赋值、引用以及类型转换等方面表现出明显的区别。
定义:
左值:表示存储在计算机内存中的对象,具有持久性和可寻址性。即,左值能够用“取地址&”运算符获得其内存地址,且在表达式结束后依然存在。左值可以出现在赋值语句的左侧,也可以出现在右侧。
右值:与左值相对,右值通常表示临时对象,它们不具有持久性和可寻址性。即,右值不能用“取地址&”运算符获得其内存地址,且在表达式结束后就不再存在。右值只能出现在赋值语句的右侧。
左/右值引用
左值引用:左值引用是对左值的引用,即给左值取别名。左值引用在C++中的内部实现通常是一个常量指针,左值引用可以引用非常量左值和常量左值,但不能直接引用右值。
右值引用:右值引用是C++11中引入的新特性,用于引用右值。它允许程序员延长临时对象的生命周期,并在需要时移动资源而不是复制资源。用 && 表示,右值引用只能绑定到右值上,不能绑定到左值上(除非通过 std::move 强制转换)
转换
左值到右值的隐式转换:在大多数情况下,左值可以隐式地转化为右值。例如 ...


