- Binlog(二进制日志):
- 是逻辑日志,记录对数据库的操作改变的SQL,包括操作类型、值、时间戳、操作者等信息,还有事务的开始、提交、回滚等标记。
- 具有平台无关性,可跨服务器、数据库引擎,但在跨平台时需要注意一些配置和环境问题。
- 主要用于数据迁移、主从复制,以及数据恢复操作。
- 在操作时,将操作记录到Binlog缓冲区中,不会立即持久化到磁盘,可以通过
async_binlog
配置在事务结束后等待Binlog磁盘持久化,保障更高的一致性。
- Redo Log(重做日志):
- 记录已提交的物理数据修改操作,用于数据库故障恢复。
- 事务ID、事务开始标记、数据页信息、数据修改操作、事务提交标记等信息。
- 在事务提交时,将操作记录到Redo Log Buffer中,然后在事务提交后写入Redo Log文件,确保事务的持久性。
- Redo Log文件是循环写入的,当写满一组文件后会进行“重写”。
- 使用
innodb_flush_log_at_trx_commit
配置控制Redo Log的刷新策略。
- Undolog(撤销日志):
- 记录数据修改的反向操作,用于事务回滚和读一致性的实现。
- 主要在MVCC中扮演重要角色,确保并发执行的一致性。
- 每个事务的操作被记录到Undolog,可用于回滚或者读一致性的需要。
- Undolog在事务提交时持久化,也具有循环写入特性。
- 使用
innodb_flush_log_at_trx_commit
配置控制Undo Log的刷新策略。
这些日志共同确保了数据库的一致性、持久性和并发控制。每种日志在不同情况下发挥不同作用,但都关键地影响了数据库操作的安全和性能。
以下是两阶段提交的基本步骤:
- 准备阶段(Prepare Phase):当一个事务要在多个节点上进行修改时,各个节点首先执行事务的操作,并将操作记录写入各自的事务日志(例如,重做日志)。然后,每个节点向一个协调者节点发送一个“准备就绪”的消息,表示它已经准备好进行提交。
- 提交阶段(Commit Phase):协调者节点在接收到所有节点的“准备就绪”消息后,向所有节点发送一个“提交”或“中止”命令。如果所有节点都准备就绪,那么协调者发送“提交”命令,所有节点将正式执行提交操作,并将修改持久化到磁盘。如果有任何节点未准备就绪,协调者发送“中止”命令,所有节点都会回滚事务操作。
意向锁表示某个事务在更细粒度的层级上可能会有锁操作。意向锁的存在可以帮助其他事务了解表或页面上是否有其他锁定操作正在进行(意向共享锁,意向排他锁)通过使用意向锁,数据库系统可以在更粗粒度的层级上协调不同锁的获取,避免了不同层级锁之间的冲突。是一种表级锁
MySQL的文件类型:
.frm文件:它存储了表的定义和结构信息,包括列名、数据类型、索引等
InnoDB引擎(已经被合并)
.ibd文件: 数据文件中包含了表的主键索引、唯一索引和辅助索引。每个索引都有对应的 B-tree 索引结构,用于加速数据的检索。
MyIsam引擎
数据文件 (.MYD):其中包含了表的数据行。
索引文件 (.MYI): 索引文件包含了表的索引信息,包括主键索引、唯一索引、辅助索引等。
存储过程是一种在数据库中预先定义好的一系列操作步骤,可以被多次调用和执行。类似于编程语言中的函数,存储过程能够接受参数、执行逻辑操作、返回结果,从而在数据库中实现复杂的业务逻辑和数据操作。
1)代码复用:类似于函数,你可以在存储过程中编写一次逻辑,然后在多个地方调用,避免了重复编写相同的代码。
2)性能优化: 存储过程在数据库内部执行,可以减少网络传输开销,提高性能。
3)数据安全性: 存储过程可以对数据进行封装,只暴露需要的接口,保护了数据的安全性。
4)事务管理: 存储过程可以在一个事务内执行多个操作,保证了数据的一致性和完整性。
所以,存储过程就像是数据库中的自定义操作,你只需要调用它们,然后它们会按照预先定义好的逻辑完成任务。这有点像在餐馆点餐,你只需要告诉厨师你想要什么,然后厨师会为你准备好美味的菜肴。
以下是 EXPLAIN
输出中的一些重要字段和信息:
id:查询的唯一标识符,用于标识查询中的不同步骤。如果查询涉及子查询,子查询的 id 会较高。
select_type:查询的类型,可以是 SIMPLE、PRIMARY、DERIVED,SUBQUERY等。
table:此行正在访问的表。
type:表示连接类型,常见的有 ALL(全表扫描)、index(使用索引扫描)、range(使用索引范围扫描)、ref(使用非唯一索引扫描)、const(使用常量表)等。类型从最优到最差的排序是:system > const > eq_ref > ref > range > index > ALL。
possible_keys:显示可能用于此查询的索引列表。
key:指示查询实际使用的索引。如果未使用索引,则该值为 NULL。
key_len:表示索引字段的最大长度。
ref:表示哪个列或常量与 key 一起被使用。
rows:估计需要扫描的行数。
Extra:提供关于查询执行的额外信息,如使用了临时表、使用了文件排序等。
- 第一范式(1NF):
- 要求每个属性都是原子的,即不能再分解为更小的数据单元。
- 每个属性值都是不可分割的。
- 例如,假设有一个表格存储学生信息,其中的"地址"字段包含了街道、城市和邮编,那么就不满足1NF。
- 第二范式(2NF):
- 要求表格满足1NF,并且每个非主键属性完全依赖于整个主键,而不是部分依赖。
- 主键是用来唯一标识一行数据的属性。
- 例如,一个订单表中包含订单号和产品信息,如果一个订单可以有多个产品,那么产品信息只依赖于订单号的一部分,不满足2NF。
- 第三范式(3NF):
- 要求表格满足2NF,并且非主键属性之间不存在传递依赖。
- 非主键属性之间不能相互依赖。
- 例如,一个学生课程表中包含学生ID、课程ID和课程教师,如果课程教师只依赖于课程ID,而不是学生ID,那么就满足3NF。
- BCNF(巴斯-科德范式):
- 要求表格满足3NF,并且每个非主键属性完全依赖于候选键,而不是超键。
- 超键是可以唯一标识一行数据的属性组合。
- 例如,一个订单-产品表中包含订单号、产品ID和订单日期,如果订单日期只依赖于订单号,而不是订单号和产品ID的组合,那么就不满足BCNF。
- 第四范式(4NF):
- 要求表格满足BCNF,并且不存在多值依赖。
- 多值依赖是指一个或多个属性的值取决于其他属性的组合,而不是单独的属性。
- 例如,一个学生-课程表中包含学生ID、课程ID和成绩,如果一个学生可以参加多门课程,每门课程有多个成绩,那么成绩就依赖于学生ID和课程ID的组合,不满足4NF。
Entity Framework Core 操作 MySQL 数据库 CRUD 操作示例
准备工作
- 确保你的项目中已经安装了
MySql.EntityFrameworkCore
,Microsoft.EntityFrameworkCore
,包。 - 导入必要的命名空间:
using Microsoft.EntityFrameworkCore;
1. 创建实体类
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
2. 创建 DbContext 类
public class ApplicationDbContext : DbContext
{
public DbSet<Student> Students { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseMySql("server=172.31.231.72;database=hb;user=root;password=123456;");
}
}
3. 添加、查询、更新和删除操作
添加数据
using var dbContext = new ApplicationDbContext();
var newStudent = new Student { Name = "John Doe", Age = 20 };
dbContext.Students.Add(newStudent);
dbContext.SaveChanges();
查询数据
using var dbContext = new ApplicationDbContext();
// 查询单个学生
var student = dbContext.Students.FirstOrDefault(s => s.Name == "John Doe");
if (student != null)
{
Console.WriteLine($"Student found - Name: {student.Name}, Age: {student.Age}");
}
// 查询所有学生
var allStudents = dbContext.Students.ToList();
foreach (var s in allStudents)
{
Console.WriteLine($"Name: {s.Name}, Age: {s.Age}");
}
更新数据
using var dbContext = new ApplicationDbContext();
var studentToUpdate = dbContext.Students.FirstOrDefault(s => s.Name == "John Doe");
if (studentToUpdate != null)
{
studentToUpdate.Age = 21;
dbContext.SaveChanges();
}
删除数据
using var dbContext = new ApplicationDbContext();
var studentToDelete = dbContext.Students.FirstOrDefault(s => s.Name == "John Doe");
if (studentToDelete != null)
{
dbContext.Students.Remove(studentToDelete);
dbContext.SaveChanges();
}
4. 使用 Where 进行筛选
using var dbContext = new ApplicationDbContext();
// 查询名字包含 "J" 并且年龄大于等于 21,或者名字包含 "A" 的学生
var students = dbContext.Students
.Where(s => (s.Name.Contains("J") && s.Age >= 21) || s.Name.Contains("A"))
.ToList();
foreach (var student in students)
{
Console.WriteLine($"Name: {student.Name}, Age: {student.Age}");
}
using var dbContext = new ApplicationDbContext();
var query = dbContext.Students.AsQueryable();
query = query.Where(s => s.Age > 20);
query = query.Where(s => s.Age < 25);
var list = query.Select(s => s.Name).ToList();
var list = query.ToList();
var list = query.FirstOrDefault();
标签:Name,Age,dbContext,索引,MySQL,var,操作
From: https://www.cnblogs.com/cooooooooookie/p/17628032.html