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;
其中,SESSION 和 GLOBAL 关键字用来指定修改的事务隔离级别的范围:
SESSION:表示修改的事务隔离级别将应用于当前 session(当前 cmd 窗口)内的所有事务;
GLOBAL:表示修改的事务隔离级别将应用于所有 session(全局)中的所有事务,且当前已经存在的
session 不受影响;
如果省略 SESSION 和 GLOBAL,表示修改的事务隔离级别将应用于当前 session 内的下一个还未开始的
事务。
- 读未提交
言简意赅,读未提交的意思就是在这个事务中我们可以读到其他事务中进行修改。但是没有提交的数据,这是隔离级别比较低的一种。由于隔离级别低,所以有可能导致一个问题“脏读”
脏读:
所谓脏读就是说,我们读到其他事务并没有提交的数据, 属于虚假数据这个时候我们就说我们脏读了。 - 读已提交
就是正常的读到提交到的数据,但是我们会遇到一个问题。那就是不能重复读。
不能重复读:
所谓不能重复读,就是说这个数据在同一个事务中,两次查询有可能会查出不一样的结果。 - 可重复读
所谓可重复读,就是解决了读已经提交的bug。可以在一次事务中查到一样的结果,不会被其他事务所干扰。 - 串行化
非常好理解。就是最严格的隔离级别。就是事务A在进行操作的时候。事务B只能进行等待。
锁的概念
行锁
是默认存在的,其中行锁是锁在索引上的,只有有索引的情况下才能触发行锁,否则就是表锁
表锁
这个表锁是可以手动开启和关闭的
- 读锁
- 开启读锁后
- 只有一个事务可以增删改查,但其他事务只可以读。
- 写锁
- 开启写锁后
- 只有一个事务可以增删改查,其他都不可以。
乐观锁
就是不锁,加一个version字段,每次进行更新的时候就给对应的version进行+1操作。
悲观锁
所有的mysql的锁都是悲观锁
大概就是这些其中锁中的内容比较枯燥和掌握起来太过复杂了。所以这篇博客暂更到这里。
笔者要继续学JAVAEE了。
Mysql的课外补充与进阶相关推荐
- 史上最简单MySQL教程详解(进阶篇)之存储过程(一)
史上最简单MySQL教程详解(进阶篇)之存储过程(一) 史上最简单MySQL教程详解(进阶篇)之存储过程(一) 什么是存储过程 存储过程的作用 如何使用存储过程 创建存储过程 DELIMITER改变分 ...
- 史上最简单MySQL教程详解(进阶篇)之存储引擎介绍及默认引擎设置
什么是存储引擎? MySQL存储引擎种类 MyISAM 引擎 InnoDB引擎 存储引擎操作 查看存储引擎 存储引擎的变更 修改默认引擎 什么是存储引擎? 与其他数据库例如Oracle 和SQL Se ...
- 史上最简单MySQL教程详解(进阶篇)之索引及失效场合总结
史上最简单MySQL教程详解(进阶篇)之索引及其失效场合总结 什么是索引及其作用 索引的种类 各存储引擎对于索引的支持 简单介绍索引的实现 索引的设置与分析 普通索引 唯一索引(Unique Inde ...
- 史上最简单MySQL教程详解(进阶篇)之视图
史上最简单MySQL教程详解(进阶篇)之视图 为什么要用视图 视图的本质 视图的作用 如何使用视图 创建视图 修改视图 删除视图 查看视图 使用视图检索 变更视图数据 WITH CHECK OPTIO ...
- MySQL 数据库(包括基础和进阶CURD、事务和索引)
文章目录 一.SQL语句分类 二.数据库操作语句 2.1显示当前服务端数据库数量 拓展:完整的登录命令 2.2SQL语句报错信息 语法错误 重复创建数据库 查询警告提示 2.3创建数据库 2.4数据库 ...
- mysql视频下载_Mysql基础+进阶完整版视频教程下载
Mysql基础+进阶完整版视频教程下载 课程介绍: Mysql是一个最常用的关系型数据库管理系统,此为python开发职业课程系列的其中一套课程.该套课程是现目前国内最齐全的mysql视频教程之一,从 ...
- mysql企业实战_实战MySQL服务器企业技术 实战进阶学习篇 企业级MySQL实战进阶视频教程...
├<2-30-tomcat环境安装管理及使用tomcat链接MySQL> │ ├2-30-1-tomcat环境介绍及部署安装.mp4 │ ├2-30-2-tomcat配置管理及配置虚拟 ...
- mysql function select 赋值_MySql 进阶
多表查询 修改表poetry_item,增加 user_id字段 mysql> ALTER table `poetry_item` ADD `user_id` varchar(30) COLLA ...
- mysql第三方工具binlog_mysql 开发进阶篇系列 33 工具篇(mysqlbinlog日志管理工具)
一.概述 由于服务器生成的二进制日志文件以二进制格式保存,所以如果要想检查这些文件的文本格式,就会用到mysqlbinlog日志管理工具. mysqlbinlog的语法如下: mysqlbinlog ...
最新文章
- 这才是世界排名前十位的奢侈品
- ubuntu 14.04 vim install youcompleteme
- 比特币早期投资家:没有人能够阻止其发展 TechWeb 09-27 09:10 凤凰科技讯 据CNBC网站北京时间9月27日报道,风险投资家、“Social+Capital”基金创始人Chamath
- linux中locate find 与 grep
- C#/ASP.NET定时任务执行管理器组件–FluentScheduler定时器
- Git missing Change-Id in commit message footer解决方法
- shell中判断远程主机的某个tcp端口是否存活
- 结合源码讲解Tabost
- 九爷 带你了解 nginx优化与防盗链
- [Java] 集合类(List、Set、Map的基本使用)
- 解决启用GTID binlog新安装完的MySQL提示无法登录
- Atitit gui的实现模式文本 dom ast 像素绘图api native 目录 1. Pl ast xml domAst	1 1.1. 简介	1 1.1.1. 【具体语法树】	2 2.
- 清华大学计算机专业高中选课系统,【清华大学计算机实验教学中心】_清华大学计算机实验教学中心...
- SI24R1切换收发模式问题调试与解决
- Vue中如何实现Excel导入导出
- 夏新N820/N821 recovery刷入教程附MT6577专用刷机工具SP_Flash_Tool_v3.1308.0.125
- 全国高校计算机能力挑战赛赛事通知
- 计算机音乐算法冯,计算机辅助算法作曲方法研究与软件设计
- Office 中的 Word
- 用MySQL绘制新年祝福图形_2020年春节,你有哪些与众不同的祝福语?
热门文章
- self-attention为什么要除以根号d_k
- Unity Game 外面一圈灰,不全屏的解决办法
- DiDi Food中的智能补贴实战漫谈
- 机器学习算法 - 频繁项集和关联规则思想
- Mac 下面安装 Git 步骤
- E. Pencils and Boxes(划窗+dp+树状数组)
- ❤送女朋友生日快乐祝福网页制作❤(HTML+CSS+JS)
- [Android 性能优化系列]内存之终极篇--降低你的内存消耗
- Acme Corporation UVA11613 网络流
- think php 后门,看我如何调查放置后门之Thinkphp