Mysql的课外补充与进阶

mysql的课外补充:

1.日期函数

  • 获取当前时间
    常用的函数有 now(),currentDate(), currentTime(),
    在这里插入图片描述

  • 获取年份和月份,参数填对应的列
    常用函数year(),month()
    在这里插入图片描述

  • 对指定时间字段进行增加或者减少时间的操作
    其中增加和减少只是函数名不同,两个不同函数的参数也不同,一个是字符串一个是int整形。
    具体请参考以下查询结果
    在这里插入图片描述
    以下是时间减少Sub_Date()
    在这里插入图片描述

  • 求两个时间字段之间的时间间隔
    DaTEDIFF函数 返回参数1减去参数2的值,是天数
    在这里插入图片描述

  • 最重要!!! 是Date_Format函数
    是为了解决让时间字段按照我们规定的格式显示。第一个参数是字段第二个是我们规定的时间戳
    有两个参数Date_Formate(字段,想要显示的格式);
    常用的格式化日期
    在这里插入图片描述

2 hash算法和md5函数

简单来说hash算法就是我们用来加密的一种算法核心是用取余的方法。
其中比较经典的就是md5函数,他可以通过算法将字符串转成加密字符串,且本过程不可逆
例如:
在这里插入图片描述
一般为了防止密码被暴力破解,常常通过前面加上用户名后面加上一个随机生成的salt来去给他加密
例如:
在这里插入图片描述

写sql的一些注意事项

Group BY的注意事项如下
Group By的字段一定要比select中的多,select中的字段一定要来自Group By

数据库设计遵守的几个规则

  • 第一范式
    第一范式是最基本且最原子的范式。
    1.每个字段要有原子性(相对的,就是基本上不能再拆分)
    例如,联系方式可以拆分成QQ和微信或者电话,但你可以说是保持了原子性
  • 第二范式
    第二范式建立在第一范式的基础上,除此以外第二范式要求一行必须有一个主键,非主键字段要完全依赖主键字段,不能产生部分依赖
    例如:
    这里很明显主键是学生编号,然而课程名称和教室等等全部不依赖于主键,因为学生编号只能决定学生信息,而不能决定课程信息,一个学生确定不一定他所学的课程就确定了,所以这是不满足第二范式的会产生数据沉杂呢。在这里插入图片描述 - 第三范式
    第三范式在第二范式的基础上,当所有非主键字段都依赖主键的时候,且不能产生传递依赖
    在这里插入图片描述
    传递依赖的本质是,有一个 字段不直接依赖于主键,比如这里的专业名称直接依赖于专业编号而并非是学生编号。

SQL进阶

索引

索引的数据结构

  • 数组和链表
    数组和链表的优点和缺点可以说是相互互补,首先数组,数组的优点是可以直接找到对应的元素,缺点是难扩容(因为数组的大小定义的时候必须附带上),链表的优点是容易扩容,缺点是不容易找到对应的元素例如,想找到第i元素就必须找到第i-1个元素。

  • hash
    类似key-map的结构,该结构查找速度快,但数据无序


  • 主要是二叉树等,以下重点介绍B树
    B站数据结构资料

  • B树
    在B数中允许一个节点有多个key,可以是3,4,5甚至更多,这里我们需要一个常数M来构造我们的B树,我们称这个以M为基础的B树叫M阶的B树。

    • 首先M阶的B树可以有M-1个key,并且升序排列(B树的数据是有序的)
    • 每个节点最多有M个子节点
    • 根节点至少有两个子节点
      在这里插入图片描述
  • B-树
    B-树在B树的基础上还有以下特点

    • 所有的键值对分布在整棵树中,且值是data
    • 任何一个关键字(id)出现只出现在一个节点中
    • 搜索可能在非叶子节点结束(因为上面的节点也有数据嘛)
    • 性能高
    • 在这里插入图片描述
  • B+树
    重点:mysql索引采用的类型
    如图,除了叶子节点外(没有子节点的节点),是没有完整的键值对的,只有键。并且每个叶子节点上的最后一个节点都有一个指针指向下一个节点的第一个键值对
    好处

    • 减少了索引所占体积。(非叶子节点没有数据)
    • 方便遍历整个索引
      在这里插入图片描述

索引的分类和创建

索引的命名
普通索引:idx_字段名
唯一索引:ux_字段名
有了索引mysql会怎么查询
索引的分类

  • 聚簇索引
    聚簇索引常见的key是主键,而data是所有数据
    像这样把所有数据放在data中这种索引叫聚簇索引
    在这里插入图片描述
    - 聚簇索引有唯一性:因为是所有的数据放在一起,所以一个表只有一个聚簇索引
    - 表中行的物理顺序和聚簇索引的物理顺序相同:所有的 非聚簇索引创建之前都会自动创建聚簇索引,这是因为聚簇索引会根据某个顺序自动重新排列表中的数据,并且维护这个数据。
    - 聚簇索引默认是主键:准确的来讲聚簇索引默认的key是主键,因为主键不为空且唯一是最好的选择。
    -
  • 非聚簇索引
    非聚簇索引和聚簇索引的区别是data值的区别
    例如在该图中右边的辅助键索引就是一个非聚簇索引,这里的key是name字段,而value值是id,非聚簇索引的data值不是全部数据。

在这里插入图片描述 3. 主键索引
主键索引是聚簇索引,其中key是主键,且当主键创建时主键索引就会自动创建
知识补充:
在这里插入图片描述
int()中所指定是类型的长度,如果没有zerofill则不会有作用,如果包含了则当真实数据大于时失效,不足时用0补充。

  • 普通索引
    就是普普通通的索引
    创建索引
create INDEX idx_name on mybatis(`name`

修改表结构来创建索引

Alter table mybatis add index idx_name(`name)

在创建表的时候指定
在这里插入图片描述

  • 唯一索引
    唯一索引相比普通索引有以下特点
    - 主键是一种约束而唯一索引是一种索引
    - 主键创建后一定会包含一个唯一性索引,而唯一性索引不一定是主键
    - 唯一性索引允许为空
    - 主键能被其他表引用成外键而唯一索引不能
    - 一个表能有多个唯一索引,但只能有一个主键
    - 主键更适合那些不容易更改的身份验证,比如编号,身份证号等

  • 复合索引
    在这里插入图片描述
    关于复合索引的一些知识:
    复合索引的优势

  • 减少开销 :建立一个(A,B,C)的索引,相当于是(A),(A,B),(A,B,C)的索引,使用复合索引能够大大减少空间开销。在A有序的前提下,B是有序的,A,B都有序的前提下C是有序的,是一种类似以下状态的感觉:
    在这里插入图片描述

  • 覆盖索引:对复合索引中(A,B,C)如果查询只需要A,B也就是索引中的字段就是我们需要的字段,我们成为覆盖索引,这种时候效率是非常高的,因为mysql不需要进行回表操作。

  • 效率高

  • 缺点:

    • 索引多,索引需要维护,所以对表的增删改增加了难度
    • 索引多,索引本身有大小,可能会导致表过大
  • 建议:一个表最好不要有超过3个联合索引
    注意事项:
    最左前缀原则。
    mysql是一直向右匹配,一直到遇到范围查询(>,<,like,in,between)时候失效
    例如:
    现在有一个(A,B,C,D)的索引,
    如果有where a=1,b=2,c>4,d=2; 则d就不能享受索引
    而如果写 where a=1 d=2; 也不能有索引,因为顺序要对,只有A有序的前提条件下B才有序
    或者 where a=1,c=2,b=3;这样就没事,等值比较是会自动调序成最佳顺序的。

  • 全文索引
    只做了解,我们有更好的替代品es(Elatic search)是一种类似模糊查询的东西

  • 空间索引
    不做了解,只需知道

索引的失效条件

  • 如果条件中有or,则索引失效,如果又想让索引生效只能让or后的每个列都加上索引
  • 在一次mysql 的select中只能使用一个index
  • 最左原则:mysql从左往后依次对比,直到遇到范围查询时停下
  • mysql如果估计全表查会比索引快则不会使用索引
  • 参与列计算的列不会使用索引

索引的试用范围

1.经常有where语句查询的
2.外键字段
3.排序字段也可以建索引
4.分组字段也可以建索引,但分组的前提是排序
5.统计字段也可以建索引,count(),max()

索引的不适合的情况

1.where条件中没有的字段
2.需要频繁更新的字段
3.参与列计算的字段
4.数据表本身数据不够大的情况下。

索引的总结

一般情况下最常见的是复合索引。而最常提问的是最左匹配原则。mysql的索引数据结构是B+/B-树,其中B+和B-树的最大区别B+树中的value是id或者主键之类的的东西,而B-树是data所以B+树的索引大小更小。
mysql最终选择是B+树的数据结构
mysql 的索引是本质上是对B+树的维护。
重点是(A,B,C,D)这个索引中本质上是A有序的情况下B才能有序,AB都有序的情况下C才能有序。这个索引是有序的,因为有序所以才能快。
其中hash索引的本质是无序是类似hashmap的结构,他的优点是快,由key精准定位所以特别快,但他的缺点是无序。
其中对于hash的知识点补充是,将一个字段串经过hash计算可以得到一个特殊的key。而如果两个字符串得到了相同的key则这种情况称之为hash膨胀

explain 关键字

在select或者其他语句之前加入explain关键字有以下的效果
在这里插入图片描述
可以看到的是查出来的并非是表中的结果,而是一些可以给我们的sql优化进行参考的字段。
以下是字段详细解释:

  • 1
  • 2

事务

事务的四大性质

事务有四大性质分别是原子性、一致性、隔离性和持久性。
原子性:
就是一个事务要么全部完成,要么全部不完成。事务自身本体就是最小的计算单位。
一致性:
就是在事务中进行的操作本来就是必须完全符合所有的预设规则。
隔离性:
数据库允许多个事务并发进行操作。隔离性可以防止事务的交叉执行导致数据的不一致。而隔离级别主要是分为四个RU,RC,RR,(串行化)
持久性:
事务处理后,对数据的修改是永久的,即便是系统故障也不会丢失。

/*开启事务*/
BEGIN;
select * from question;
/*如果我们不想对数据库进行修改,我们还可以回滚*/
ROLLBACK;
/*提交,只有提交了之后,事务才真正影响了数据库*/
commit;

事务的隔离级别

如何改变事务的隔离级别?

ELECT @@global.tx_isolation, @@tx_isolation;
set session transaction isolation level repeatable read;
SET transaction isolation level read uncommitted;
SET transaction isolation level read committed;
set transaction isolation level repeatable read;
SET transaction isolation level serializable;
SET GLOBAL transaction isolation level read uncommitted;
SET GLOBAL transaction isolation level read committed;
set GLOBAL transaction isolation level repeatable read;
SET GLOBAL transaction isolation level serializable;
其中,SESSIONGLOBAL 关键字用来指定修改的事务隔离级别的范围:
SESSION:表示修改的事务隔离级别将应用于当前 session(当前 cmd 窗口)内的所有事务;
GLOBAL:表示修改的事务隔离级别将应用于所有 session(全局)中的所有事务,且当前已经存在的
session 不受影响;
如果省略 SESSIONGLOBAL,表示修改的事务隔离级别将应用于当前 session 内的下一个还未开始的
事务。
  • 读未提交
    言简意赅,读未提交的意思就是在这个事务中我们可以读到其他事务中进行修改。但是没有提交的数据,这是隔离级别比较低的一种。由于隔离级别低,所以有可能导致一个问题“脏读
    脏读:
    所谓脏读就是说,我们读到其他事务并没有提交的数据, 属于虚假数据这个时候我们就说我们脏读了。
  • 读已提交
    就是正常的读到提交到的数据,但是我们会遇到一个问题。那就是不能重复读。
    不能重复读:
    所谓不能重复读,就是说这个数据在同一个事务中,两次查询有可能会查出不一样的结果。
  • 可重复读
    所谓可重复读,就是解决了读已经提交的bug。可以在一次事务中查到一样的结果,不会被其他事务所干扰。
  • 串行化
    非常好理解。就是最严格的隔离级别。就是事务A在进行操作的时候。事务B只能进行等待。

锁的概念

行锁

是默认存在的,其中行锁是锁在索引上的,只有有索引的情况下才能触发行锁,否则就是表锁

表锁

这个表锁是可以手动开启和关闭的

  • 读锁
  • 开启读锁后
  • 只有一个事务可以增删改查,但其他事务只可以读。
  • 写锁
  • 开启写锁后
  • 只有一个事务可以增删改查,其他都不可以。

乐观锁

就是不锁,加一个version字段,每次进行更新的时候就给对应的version进行+1操作。

悲观锁

所有的mysql的锁都是悲观锁
大概就是这些其中锁中的内容比较枯燥和掌握起来太过复杂了。所以这篇博客暂更到这里。
笔者要继续学JAVAEE了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值