2021-06-07~2021-06-11总结(MySQL)

工作总结

工作内容

本周的工作内容主要是对之前所实现功能的bug进行修改,主要的问题为三个平台之间流程、权限。这就要求在最初开发设计以及代码的编写上,需要预留出后期可能出现的改动问题,使代码维护性更高。那么本周的技术探索,就谈一谈mysql数据库。

技术探索

1.浅谈MySQL

开放源码的,轻量型的数据库管理系统。使用简单快捷。

1.1 MySQL的引擎

引擎分为两种:MyISAM和InnoDB,MySQL默认的存储引擎是MyISAM,其他常用的就是InnoDB,InnoDB比较常用。

1.1.1 InnoDB
  • InnoDB 的存储文件有两个,后缀名分别是 .frm 和 .idb,其中 .frm 是表的定义文件,而 .idb 是数据文件
  • InnoDB 中存在表锁行锁,不过行锁是在命中索引的情况下才会起作用。
  • InnoDB 支持事务(属性:原子性、一致性、隔离性、持久性),且支持四种隔离级别(读未提交、读已提交、可重复读、串行化),默认的为可重复读;而在 Oracle 数据库中,只支持串行化级别和读已提交这两种级别,其中默认的为读已提交级别。
  • InnoDB:需要更多的内存和存储,会在内存中建立专用的缓冲池用于高速缓冲数据和索引。索引和数据紧密捆绑,索引无压缩,所以体积相对比较大
  • InnoDB:利用B+Tree 来存储数据。
InnoDB行锁模式及加锁方式:

InnoDB实现了以下两种类型的行锁:
共享锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。
排他锁(X):允许获取排他锁的事务更新数据,阻止其他事务取得相同的数据集共享读锁和排他写锁。
为了允许行锁和表锁共存,实现多粒度锁机制,InnoDB还有两种内部使用的意向锁(Intention Locks),这两种意向锁都是表锁:
意向共享锁(IS):事务打算给数据行共享锁,事务在给一个数据行加共享锁前必须先取得该表的IS锁。
意向排他锁(IX):事务打算给数据行加排他锁,事务在给一个数据行加排他锁前必须先取得该表的IX锁。
InnoDB行锁实现方式意味着:只有通过索引条件检索数据,InnoDB才会使用行级锁,否则,InnoDB将使用表锁。在实际应用中,要特别注意InnoDB行锁的这一特性,不然的话,可能导致大量的锁冲突,从而影响并发性能 。(InnoDB只有通过索引查数据才使用行级锁)

1.1.2 Myisam
  • Myisam 的存储文件有三个,后缀名分别是 .frm、.MYD、MYI,其中 .frm 是表的定义文件,.MYD 是数据文件,.MYI 是索引文件
  • Myisam 只支持表锁,且不支持事务。Myisam 由于有单独的索引文件,在==读取数据方面的性能很高 ==。
  • MyISAM:可被压缩,存储空间较小。索引和数据是分开的,并且索引有压缩,能使用更多的索引,所以内存使用率比较高
  • MyISAM:
MyISAM只有表锁,且没有事务。

表级锁有两种模式:
表共享读锁(Table Read Lock):对MyISAM表的读操作,不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写请求;
表独占写锁(Table Write Lock):对 MyISAM表的写操作,则会阻塞其他用户对同一表的读和写操作;MyISAM表的读操作与写操作之间,以及写操作之间是串行的

1.1.3 MySQL的锁机制

其中最显著的特点是不同的存储引擎支持不同的锁机制。MyISAM和MEMORY存储引擎采用的表级锁(table-level locking);BDB存储引擎采用的是页面锁(page-level locking),也支持表级锁(table-level locking);InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁,默认采用行级锁。

  1. 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发最低。
  2. 行级锁:开销大,枷锁慢;会出现死锁;锁粒度最小;发生锁冲突的概率最低,并发最高。
  3. 页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。
1.1.4 MySQL 的 B+Tree

目前大多数数据库系统及文件系统都采用 B-Tree 或其变种 B+Tree 作为索引结构。
B+ 树索引是 B+ 树在数据库中的一种实现,是最常见也是数据库中使用最为频繁的一种索引。B+ 树中的 B 代表平衡,而不是二叉。
因为 B+ 树是从最早的平衡二叉树演化而来的。B+ 树是由二叉查找树、平衡二叉树(AVLTree)和平衡多路查找树(B-Tree)逐步优化而来。

1.2 数据类型:

MySQL持所有标准的SQL数据类型,(数值类型字符串类型时间日期类型

1.2.1 数值类型:
  1. 整数类型
数据类型字节数无符号数的取值范围有符号数的取值范围
TINYINT10~255-128~127
SMALLINT20~65535-32768~32768
MEDIUMINT30~16777215-8388608~8388608
INT40~4294967295-128~127
BIGINT80~18446744073709551615-9223372036854775808~9223372036854775808
  1. 浮点类型
数据类型字节数无符号数的取值范围有符号数的取值范围
FLOAT4-3.402823466E+38~-1.175494351E-380和1.175494351E-38~3.402823466E+38
DOUBLE8-1.7976931348623157E+308~2.2250738585072014E-3080和2.2250738585072014E-308~1.7976931348623157E+308
DECIMAL(M,D)M+2-1.7976931348623157E+308~2.2250738585072014E-3080和2.2250738585072014E-308~1.7976931348623157E+308

DECIMAL类型的有效取值范围是由M和D决定的。其中,M表示的是数据的长 度,D表示的是小数点后的长度。比如,将数据类型为DECIMAL(5,2)的数据1.23456 插人数据库后显示的结果为1.23

1.2.2 字符串类型:

当数据为CHAR(M)类型时,不管插入值的长度是实际是多少它所占用的存储空间都是M个字节;而VARCHAR(M)所对应的数据所占用的字节数为实际长度加1

数据类型储存范围
TINYTEXT0~255字节
TEXT0~65535字节
MEDIUMTEXT0~16777215字节
LONGTEXT0~4294967295字节
1.2.3 时间日期类型:
数据类型字节数取值范围日期格式零值
YEAR11901~2155YYYY 0000
DATE41000-01-01~9999-12-31YYYY-MM-DD0000-00-00
TIME3-838:59:59~ 838:59:59HH:MM:SS00:00:00
DATETIME81000-01-01 00:00:00~9999-12-31 23:59:59YYYY-MM-DD HH:MM:SS0000-00-00 00:00:00
TIMESTAMP4 1970-01-01 00:00:01~2038-01-19 03:14:07YYYY-MM-DD HH:MM:SS0000-00-00 00:00:00
  • YEAR类型
    YEAR类型用于表示年份,在MySQL中,可以使用以下三种格式指定YEAR类型 的值。
    1、使用4位字符串或数字表示,范围为’1901’—'2155’或1901—2155。例如,输人 ‘2019’或2019插人到数据库中的值均为2019。
    2、使用两位字符、两位数字串表示,范围为’00’—‘99’。其中,‘00’—'69’范围的值会被转换为 2000—2069范围的YEAR值,‘70’—'99’范围的值会被转换为1970—1999范围的YEAR 值。例如,输人’19’插人到数据库中的值为2019。(区分’0’和0。因为字符串格式的’0’表示的YEAR值是2000而数字格式的0表示的YEAR值是0000
  • TIME类型
    TIME类型用于表示时间值,它的显示形式一般为HH:MM:SS,其中,HH表示小时, MM表示分,SS表示秒。在MySQL中,可以使用以下3种格式指定TIME类型的值。
    1、以’D HH:MM:SS’字符串格式表示。其中,D表示日可取0—34之间的值, 插人数据时,小时的值等于(DX24+HH)。例如,输入’2 11:30:50’插人数据库中的日期为59:30:50。
    2、使用CURRENT_TIME或==NOW()==输人当前系统时间。
  • DATETIME类型
    DATETIME类型用于表示日期和时间,它的显示形式为’YYYY-MM-DD HH: MM:SS’,其中,YYYY表示年,MM表示月,DD表示日,HH表示小时,MM表示分,SS 表示秒。在MySQL中,可以使用以下4种格式指定DATETIME类型的值。
  • TIMESTAMP类型
    TIMESTAMP类型用于表示日期和时间,它的显示形式与DATETIME相同但取值范围比DATETIME小。在此,介绍几种TIMESTAMP类型与DATATIME类型不同的形式:
    1、使用CURRENT_TIMESTAMP输人系统当前日期和时间。
    2、输人NULL时系统会输人系统当前日期和时间。
    3、无任何输人时系统会输入系统当前日期和时间。

原文链接:引用文章

总结

1、本文为查看很多材料的学习总结,还是做的比较笼统。
2、在后续需编写一份有关mysql基础语句使用的文章。
3、其实要了解mysql的比较内在的东西光看几篇文章还是不够的,后续观看完相关课程后再补完这篇学习总结。

做自己,做更好的自己--zwx
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值