MySQL事务、索引

事务

  • 事务是指将一系列数据操作捆绑成为一个整体进行统一管理,如果某一事物执行成功,则在该事务中进行的所有数据更改均会提交,成为数据库中永久的一部分。如果事务执行中遇到错误且必须取消或回滚,则数据将会全部恢复到操作前的状态,所有数据的更改将全部被清除。

事务的属性

  • 原子性(atomicity):同一事务的多个SQL是不可分割整体,执行过程中要么全部成功、要么全部失败。
  • 一致性(consistency):事务开始前和事物结束后,数据库中的数据处于一致状态。
  • 隔离性(isolation):事务与事务之间相互独立,互不干涉。
  • 持久性(durability):事务执行后将被永久的写入数据库。

如何执行事务

  1. InnoDB存储引擎管理事务主要的通过UNDO日志和REDO日志实现,MyISAM存储引擎不支持事务。
    UNDO日志:复制事务执行前的数据,用于在事务发生异常时回滚数据。
    REDO日志:记录在事务执行过程中,对数据的更新操作,当事务提交时,该内容将被刷新到磁盘。

  2. 默认情况下每条SQL语句就是一个事务,即执行SQL语句后自动提交。为了达到将几个操作作为一个整体的目的,需要使用BEGIN或START TRANSACTION开启一个事务,或执行命令SET AUTOCOMMIT = 0,来禁止当前会话的自动提交。

  • 开始事务:BEGIN 或 START TRANSACTION
    显示地标记一个事务的起始点
  • 提交事务:COMMIT;
    标志一个事务成功提交。并释放资源。
  • 回滚(撤销)事务:ROLLBACK;
    清除自事务起始点至该语句所做的所有数据更改操作,将数据状态回滚到事务开始前,并释放资源。
  1. 在数据库操作中,为了保证并发读取数据的正确性,提出了事务的隔离级别。在MySQL中,事物的默认隔离级别是REPEATABLE-READ(可重读)隔离级别。

  2. 设置自定提交关闭或开启事务
    MySQL默认开启自动提交。
    SET AUTOCOMMIT = 0;
    值为0:关闭自动提交
    值为1:开启自动提交

  3. 编写事务时要遵守以下原则:

  • 事务尽可能间断。
  • 事务中访问的数据量尽可能减少。
  • 查询数据时不要使用事务。
  • 在事务处理过程中尽量不要出现等待用户输入的操作。

视图

  1. 什么是视图
  • 视图是基于SQL语句的结果集的可视化的表,是一个虚拟表。对查询执行的大多数操作也可在视图上进行。使用视图的原因有两个:一个是安全考虑,另一个是符合用户日常业务逻辑,使他们更容易理解数据。
  • 试图是一种查看数据库中一个或多个表中的数据的方法。视图是一种虚拟表,通常是作为来自一个或多个表的行或列的子集创建的。视图并不是数据库中存储的数据集合,他的行和列来自查询中引用的表。
  1. 视图的应用场景
  • 筛选表中的行。
  • 防止未经许可的用户访问敏感数据。
  • 将多个物理数据表抽象为一个逻辑数据表。
  1. 视图的好处
  • 对最终用户的好处
    结果更容易理解,创建视图时,可以将列名更改为更有意义的名称
    获取数据更容易
  • 对开发人员的好处
    限制数据检索更容易。
    维护应用程序更容易。调试视图比调试查询更容易。
  1. 如何创建和使用视图
  • 使用SQL语句创建视图
    语法:CREATE VIEW 视图名
    AS
    <SELECT 语句>
    

视图一般以view_xxx或v_xxx的样式来命名。

  • 使用SQL语句删除视图
    语法:DROP VIEW [IF EXISTS] 视图名
    
  • 使用SQL语句查看视图数据
    语法:SELECT 字段1 , 字段2 ,... FROM 视图名
    
  • 使用视图的注意事项
    每个视图中可以使用多个表。
    与查询类似,一个视图可以嵌套另一个视图,但最好不要超过3层。
    对视图数据进行添加、修改、删除操作直接影响原表中的数据。
    当视图来自多个表时,不允许添加和删除数据。
    视图说明:从一个或多个表或视图中导出的虚拟表,其结构和数据是建立在对表的查询基础上的。理论上它可以像普通的物理表一样使用,如增删改查操作。但是在实际开发中视图仅用作查询。
  • 如何区分视图和表?
    MySQL自动创建的数据库information_schema中存在一个包含视图信息的表views,可以通过views来查看所有视图的相关信息。SQL语法:USE information_schema; SELECT * FROM views[\G];

索引

什么是索引
  1. 索引提供指针以指向存储在表中指定的数据值,再根据指定的排序次序排列这些指针,通过搜索索引找到特定的值,再跟随指针到达包含该值的行。
  2. 索引使数据库程序无需对整个表进行扫描,就可以在其中找到所需数据。
  3. 通过MySQL可以快速有效地查找与键值相关联的字段,根据索引的存储类型,可以将索引分为B-树索引(BTREE)和哈希索引(HASH)。
索引的作用
  1. 通过使用索引可以大大提高数据库的检索速度,改善数据库性能。
  2. 通过创建唯一索引,可以保证插入的数据的每一行保持唯一性。
  3. 可以加速表和表之间的连接。
  4. 在使用分组和排序字句进行数据检索时,同样可以显著的减少时间
  5. 通过使用索引可以在查询过程中,使用查询优化器,提高系统性能。
索引分类
  1. 普通索引(INDEX)
    允许在定义的列中插入重复和空值,它的唯一任务是加快对数据的访问速度。
  2. 唯一索引(UNIQUE)
    唯一索引不允许两行具有相同的索引值。
    如果创建了唯一约束,则自动创建唯一索引。
  3. 主键索引(PRIMARY KEY)
    主键索引是唯一索引的特殊类型。主键索引要求主键中的每个值是非空、唯一的。当在查询中使用主键索引时,它还允许快速访问数据。
  4. 复合索引
    在创建索引时,并不是只能对其中一列创建索引,与其创建主键一样,可以将多个列组合为索引,这种索引称为复合索引。
    需要注意的是,只有在查询中使用了组合索引最左边的字段时,索引才会被使用,即第一个字段为前缀的集合。
  5. 全文索引(FULLTEXT)
    全文索引的作用是在定义索引的列上支持值的全文查找,适合大型数据集,允许在这些索引列中插入重复值和空值。全文索引可以在CHAR、VARCHAR、TEXT类型的列上创建,主要用于在大量文本文字中搜索字符串,此时使用全文索引的效率将大大高于使用SQL的LIKE关键字的效率。
  6. 空间索引
    空间索引是对空间数据类型的列建立的索引,如GEOMETRY、POINT等。创建空间索引的列,必须将其声明为NOT NULL,空间索引只能在存储引擎为MyISAM的表中创建。
创建索引
  1. 建表添追加
  2. 建表后追加
  • ALERT TABLE 表名 ADD  索引类型(数据列名)
    
  1. 建表后追加
  • CREATE 索引类型 INDEX index_name table_name(column_name[length]......)
    index_name :指定索引名。
    table_name:指定需要创建索引的表名。
    column_name:指定需要创建索引的列。
    length:索引长度,可选。只有字符串类型才能指定索引长度,索引长度不能长于原字段长度。
    
  1. like语句操作
    一般情况下不鼓励使用like操作,如果非使用不可,如何使用也是一个问题。like “%aaa%” 不会使用索引,而like “aaa%”可以使用索引
  2. 在列上进行运算会让索引失效。
删除索引
  1. DROP INDEX(或KEYS) table_name.index_name
  2. 删除表时,该表的所有索引将同时被删除。
  3. 删除表中的列时,如果删除的列时索引的组成部分,则该列也会从索引中删除。
查看索引
  1. 语法:SHOW INDEX FROM table_name[\G]
  2. 例如查询a表中的索引得出如下图:
    在这里插入图片描述
  • Table:表示创建索引的表
  • Non_unique:表示索引是否唯一,1代表是非唯一索引,0代表唯一索引。
  • Key_name:表示索引的名称
  • Seq_in_index:表示该列在索引中的位置,如果索引是单列的,该值为1,组合索引为每列在索引定义中的顺序。
  • Column_name:表示定义索引的列字段。
  • Sub_part:表示索引的长度
  • Null:表示该列是否能为空值
  • Index_type:表示索引类型。
    注:在查询语句后边加“ \G” ,表示将结果集按列显示。
什么地方创建索引
  1. 使用索引可以加快数据检索速度,但没有必要为每个列都建立索引。因为所以呢自身也需要维护,并占用一定的资源,可以按照以下标准选择建立索引
  • 经常用作查询选择条件的列。
  • 经常排序、分组的列。
  • 经常用作连接的列(主键/外键)
  • 查询时减少使用&*返回全部列,不要返回不需要的列。
  • 索引应该尽量小,在字节数小的列上建立索引。
  • WHERE子句中有多个条件表达式,包含索引列的表达式应置于其他条件表达式之前。
  • 避免在ORDER BY 子句中使用表达式。
  • 定期重新生成或重新组织索引,进行碎片整理。

数据库的备份和恢复

备份数据库
  1. mysqldump -u username -h host -p password dbname[tbname1 [,tbname2…]] > filename.sql
  • 其中username:用户名
  • host:主机地址、本机可以省略
  • password:登录密码
  • dbname:需要备份的数据库名
  • tbname:需要备份的数据表,可以是多张表(如果备份整个数据库则可以省略此项)
  • filename.sql:备份文件的名称
    注:mysqldump 是DOS系统下的命令,无需进入MySQL命令行。
恢复数据库
  1. mysql -u username -p [daname] < filename.sql
    注:再执行该语句之前,必须在Mysql服务器中创建新数据库,如果不存在新数据库,恢复数据库过程将会出错。
  2. 还可以通过复制文件进行数据库的备份和恢复,但需要注意复制文件前先执行FLUSH TANLE语句将所有数据写入导数据文件中,然后停止Mysql服务。
  3. 还可以通过可视化工具进行操作,相对简单。

Explain执行计划

MySQL性能优化神器Explain使用分析转载

执行计划是什么
  • 使用EXPLAIN关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的。分析你的查询语句或是表结构的性能瓶颈
  1. 语法:
    Explain + SQL语句
  • explain可以显示select,insert,update,delete,replace语句的信息
  • explain和可解释性语句执行时,MySQL将显示来自优化器的有关执行语句的优化信息
  • explain与不可解释的语句一起使用时,它将显示在命名连接中执行的语句的执行计划
  • 对于select语句, explain产生可以使用来显示的其他执行计划信息
  • explain对于检查涉及分区表的查询很有用
  • 该FORMAT选项可用于选择输出格式。TRADITIONAL以表格格式显示输出

执行计划的作用

  • 表的读取顺序
  • 数据读取操作的操作类型
  • 哪些索引可以使用
  • 哪些索引被实际使用
  • 表之间的引用
  • 每张表有多少行被优化器查询
执行计划包含的信息

在这里插入图片描述

  1. id:表示执行顺序
  • id相同,可认为是一组,执行顺序由上至下。
  • id不同,如果是子查询,id会递增,id值越大,优先级越高。
  • id相同、不同,同时存在。
  1. select_type:查询的类型,主要是用于区别普通查询、联合查询、子查询等的复杂查询
    查询类型分为以下几类:
    在这里插入图片描述

  2. table:显示这一行的数据是关于哪张表的

  3. type:显示的是访问类型,是较为重要的一个指标,结果值从最好到最坏依次是:ystem>const>eq_ref>ref>range>index>ALL

  • system表只有一行记录(等于系统表),这是const类型的特列,平时不会出现,这个也可以忽略不计。
  • const表示通过索引一次就找到了const用于比较primary key或者unique索引。因为只匹配一行数据,所以很快如将主键置于where列表中,MySQL就能将该查询转换为一个常量。
  • eq_ref 唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描。
  • ref 非唯一性索引扫描,返回匹配某个单独值的所有行。本质上也是一种索引访问,它返回所有匹配某个单独值的行,然而,它可能会找到多个符合条件的行,所以他应该属于查找和扫描的混合体
  • range只检索给定范围的行,使用一个索引来选择行。key 列显示使用了哪个索引一般就是在你的where语句中出现了between、<、>、in等的查询这种范围扫描索引扫描比全表扫描要好,因为它只需要开始于索引的某一点,而结束语另一点,不用扫描全部索引。
  • all Full Table Scan,将遍历全表以找到匹配的行。
  1. possible_keys:实际使用的索引。如果为NULL,则没有使用索引。查询中若使用了覆盖索引,则该索引和查询的select字段重叠。
  2. key:此次查询确切使用到的索引。
  3. key_len:表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度。在不损失精确性的情况下,长度越短越好。key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的
  4. ref :显示索引的哪一列被使用了,如果可能的话,是一个常数。哪些列或常量被用于查找索引列上的值。
  5. rows:根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数。
  6. Extra:包含不适合在其他列中显示但十分重要的额外信息。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我! 毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip
综合小区管理系统管理系统按照操作主体分为管理员和用户。管理员的功能包括报修管理、车位管理、车位分配管理、出入管理、字典管理、房屋管理、物业费缴纳管理、公告管理、物业人员投诉管理、我的私信管理、物业人员管理、用户管理、管理员管理。用户的功能包括管理部门以及部门岗位信息,管理招聘信息,培训信息,薪资信息等。该系统采用了Mysql数据库,Java语言,Spring Boot框架等技术进行编程实现。 综合小区管理系统管理系统可以提高综合小区管理系统信息管理问题的解决效率,优化综合小区管理系统信息处理流程,保证综合小区管理系统信息数据的安全,它是一个非常可靠,非常安全的应用程序。 管理员权限操作的功能包括管理公告,管理综合小区管理系统信息,包括出入管理,报修管理,报修管理,物业费缴纳等,可以管理操作员。 出入管理界面,管理员在出入管理界面中可以对界面中显示,可以对招聘信息的招聘状态进行查看,可以添加新的招聘信息等。报修管理界面,管理员在报修管理界面中查看奖罚种类信息,奖罚描述信息,新增奖惩信息等。车位管理界面,管理员在车位管理界面中新增。公告管理界面,管理员在公告管理界面查看公告的工作状态,可以对公告的数据进行导出,可以添加新公告的信息,可以编辑公告信息,删除公告信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值