首页 > 数据库 >MySQL

MySQL

时间:2023-08-14 10:56:05浏览次数:39  
标签:Name Age dbContext 索引 MySQL var 操作

  1. Binlog(二进制日志)
    • 是逻辑日志,记录对数据库的操作改变的SQL,包括操作类型、值、时间戳、操作者等信息,还有事务的开始、提交、回滚等标记。
    • 具有平台无关性,可跨服务器、数据库引擎,但在跨平台时需要注意一些配置和环境问题。
    • 主要用于数据迁移、主从复制,以及数据恢复操作。
    • 在操作时,将操作记录到Binlog缓冲区中,不会立即持久化到磁盘,可以通过async_binlog配置在事务结束后等待Binlog磁盘持久化,保障更高的一致性。
  2. Redo Log(重做日志)
    • 记录已提交的物理数据修改操作,用于数据库故障恢复。
    • 事务ID、事务开始标记、数据页信息、数据修改操作、事务提交标记等信息。
    • 在事务提交时,将操作记录到Redo Log Buffer中,然后在事务提交后写入Redo Log文件,确保事务的持久性。
    • Redo Log文件是循环写入的,当写满一组文件后会进行“重写”。
    • 使用innodb_flush_log_at_trx_commit配置控制Redo Log的刷新策略。
  3. Undolog(撤销日志)
    • 记录数据修改的反向操作,用于事务回滚和读一致性的实现。
    • 主要在MVCC中扮演重要角色,确保并发执行的一致性。
    • 每个事务的操作被记录到Undolog,可用于回滚或者读一致性的需要。
    • Undolog在事务提交时持久化,也具有循环写入特性。
    • 使用innodb_flush_log_at_trx_commit配置控制Undo Log的刷新策略。

这些日志共同确保了数据库的一致性、持久性和并发控制。每种日志在不同情况下发挥不同作用,但都关键地影响了数据库操作的安全和性能。

以下是两阶段提交的基本步骤:

  1. 准备阶段(Prepare Phase):当一个事务要在多个节点上进行修改时,各个节点首先执行事务的操作,并将操作记录写入各自的事务日志(例如,重做日志)。然后,每个节点向一个协调者节点发送一个“准备就绪”的消息,表示它已经准备好进行提交。
  2. 提交阶段(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:提供关于查询执行的额外信息,如使用了临时表、使用了文件排序等。

  1. 第一范式(1NF):
    • 要求每个属性都是原子的,即不能再分解为更小的数据单元。
    • 每个属性值都是不可分割的。
    • 例如,假设有一个表格存储学生信息,其中的"地址"字段包含了街道、城市和邮编,那么就不满足1NF。
  2. 第二范式(2NF):
    • 要求表格满足1NF,并且每个非主键属性完全依赖于整个主键,而不是部分依赖。
    • 主键是用来唯一标识一行数据的属性。
    • 例如,一个订单表中包含订单号和产品信息,如果一个订单可以有多个产品,那么产品信息只依赖于订单号的一部分,不满足2NF。
  3. 第三范式(3NF):
    • 要求表格满足2NF,并且非主键属性之间不存在传递依赖。
    • 非主键属性之间不能相互依赖。
    • 例如,一个学生课程表中包含学生ID、课程ID和课程教师,如果课程教师只依赖于课程ID,而不是学生ID,那么就满足3NF。
  4. BCNF(巴斯-科德范式):
    • 要求表格满足3NF,并且每个非主键属性完全依赖于候选键,而不是超键。
    • 超键是可以唯一标识一行数据的属性组合。
    • 例如,一个订单-产品表中包含订单号、产品ID和订单日期,如果订单日期只依赖于订单号,而不是订单号和产品ID的组合,那么就不满足BCNF。
  5. 第四范式(4NF):
    • 要求表格满足BCNF,并且不存在多值依赖。
    • 多值依赖是指一个或多个属性的值取决于其他属性的组合,而不是单独的属性。
    • 例如,一个学生-课程表中包含学生ID、课程ID和成绩,如果一个学生可以参加多门课程,每门课程有多个成绩,那么成绩就依赖于学生ID和课程ID的组合,不满足4NF。

Entity Framework Core 操作 MySQL 数据库 CRUD 操作示例

准备工作

  1. 确保你的项目中已经安装了 MySql.EntityFrameworkCoreMicrosoft.EntityFrameworkCore,包。
  2. 导入必要的命名空间: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

相关文章

  • 使用node_exporter方式采集MySQL慢SQL信息在grafana面板显示
    【背景说明】因为要集成监控数据,需要把MySQL的慢SQL日志信息显示在grafana,其他方法抓取慢日志然后显示到面板需要安装挺多插件,是简单的脚本采集数据,这里使用node_exporter方式实现。说明:看实际情况,方便的采集MySQL慢日志的话可以直接使用PMM来监控就行【步骤】前提:安装好prome......
  • 探索MySQL 8的事务数据字典:数据库对象信息存储
    MySQL8带来了重大的架构变革,用事务数据字典(TDD)这种更高效、更可靠的方法取代了传统的基于MyISAM引擎的系统表。这一升级极大地改进了元数据的管理和存储,从而提高了各种数据库对象的可靠性和可扩展性。本文将通过实际案例探讨MySQL8事务数据字典的复杂性、优势及其在现实生活中......
  • 技术分享 | kill掉mysqld_safe进程会影响mysqld进程?
    1、背景公司内部看到一则问题1、kill-9mysqld_safe进程2、systemd检测到mysqld_safe进程不存在后,重新拉起mysqld_safe进程3、mysqld_safe进程启动后,发现mysqld进程也被重启期望:启、停mysqld_safe进程,不会影响mysqld进程2、systemd服务启动2.1、复现问题......
  • 面试官:为什么MySQL不建议使用NULL作为列默认值?(转)
    原文:https://mp.weixin.qq.com/s/4aWKVvGTjG4Hiv2ULxQiAg来源:微信公众号“Java充电社”今天来分享一道美团高频面试题,5分钟搞懂“为什么MySQL不建议使用NULL作为列默认值?”。对于这个问题,通常能听到的答案是 使用了NULL值的列将会使索引失效,但是如果实际测试过一下,你......
  • 开源数据库Mysql_DBA运维实战 (修改root密码)
    本文以windows为例为大家详细介绍下MySQL修改root密码的4种方法,大家可以可以根据的自己的情况自由选择,希望对大家有所帮助方法1:用SETPASSWORD命令首先登录MySQL。格式:mysql>setpasswordfor用户名@localhost=password('新密码');例子:mysql>setpasswordforroot@localh......
  • nacos 使用 MySQL8.x 出现 Nacos No DataSource set异常解决
    http://www.taodudu.cc/news/show-6345954.html?action=onClick nacos使用MySQL8.x出现NacosNoDataSourceset异常解决注:当前版本nacos2.1.0 1、nacos默认室mysql5.7当链接mysql8.x,会出现异常【NacosNoDataSourceset】解决:在nacos安装目录下新建plugins/mysql文......
  • mysql添加非 root 级别用户
    进入mysql容器内部dockerexec-itCOMMAND/bash输入密码登录MySQL回车输入密码passwordroot@94c490e7da78:/#mysql-pEnterpassword:添加数据库先使用root用户添加数据库:--进入sql服务后首先查看有哪些数据库showdatabases;--若没有新建一个CREATE......
  • mysql数据库中有表,但是抛异常,Table 'test.WORRK_NODE' donesn't exist
    原因:表名是大写的,linux上的msyql默认区分大小写问题,本地的mysql不会出现这个问题解决一:修改sql语句,变成小写库名,表名方法二:把原来表删了,重新建表,建立表时指定字符集utf8_general_ci,该字符集对大小写不敏感 解决三:开启忽略大小写,需要修改/etc/my.cnf配置文件 注意:这个配......
  • MySQL 的开窗函数
    开窗函数(WindowFunction)提供了行集之间的计算能力,在现代的主流关系型数据库中,基本都提供了相似的功能,这些功能在一些业务开发的过程中很有用,本文将简要介绍这些常用的开窗函数ROW_NUMBER()ROW_NUMBER()函数的使用语法如下:ROW_NUMBER()OVER([partition_definition][order_......
  • Found a misplaced row,分区表修复MYSQL
    在MySQL中,分区表的数据被分隔到不同的表空间中,但仍被视为单个表。在处理大量数据集的某些情况下,分区可能是一种有用的方法。在分区表中删除庞大的数据集可以加快速度,但是如果处理不当,它可能会把数据放在表的不对应的位置中。测试环境:mysql8.0.30建表master[localhost:22031]{msa......