文章最初发表于公众号:程序员周先森。本平台不定期更新,喜欢我的文章,请关注我的微信公众号。Redis系列从上一篇已经全部结束,本篇将进入Mysql系列文章。本文是Mysql系列的开篇,主要是让大家对什么是Mysql有一个大概的了解。本文的主要内容是:什么是数据库?数据库中的几个基本名词?Mysql中InnoDB引擎支持的4个事务隔离级别如何使用ENUM?Mysql中的存储引擎mysql中char和varchar有什么区别?主键和候选键的区别?blob和text的区别?Mysql中锁数据库的三种范式什么是数据库?其实,顾名思义,数据库就是一个存放数据的仓库。数据库可存储数亿条数据,数据来源众多,如系统消费记录、发送消息记录等文本类型数据。当然,数据也可以是图形或音乐。格式化数据。数据库是按照特定的数据结构组织、存储和管理数据的仓库。其实数据库的本质就是将数据存储在磁盘上的本地文件中,只是对外提供了一个API,所以我们不需要写操作数据文件。指示。使用最广泛的关系数据库是Oracle、Mysql和SQLServer。我这里是基于Mysql来讲解的。数据库中的几个基本术语数据库:一个用于存储数据的仓库,它是一些关联表的集合。数据表:是数据的矩阵,可以理解为电子表格。数据表中的列:表示一个属性,比如用户名。数据表中的行:表示一行数据,比如用户表中指定用户的用户信息。主键:一张数据表只能设置一个主键,可以唯一标识一条数据,但也可以将多列组合为主键。InnoDB引擎支持的四种事务隔离级别InnoDB引擎支持的四种事务隔离级别是:读未提交、读已提交、可重复读和串行读。ReadUncommitted:允许脏读,可以读取其他会话中未提交的脏数据。Readsubmitted:无法读取其他session未提交的数据。只能读取其他已经提交的session数据,属于不可重复读。Repeatableread:该级别的Repeatableread,InnoDB引擎默认使用repeatableread,不允许读取未提交的脏数据,但可能会出现InnoDB特有的幻读。串行读:该级别隔离度最高,事务只能依次串行执行,不能并发执行。每次串行读都需要获取表级共享锁,读写操作会被阻塞。幻读事务是插入一条已经检查过的不存在的记录,但是插入的结果是数据已经存在,之前的检查操作就像幻影一样。Mysql默认使用可重复读级别,所以只能出现幻读。如何在Mysql中使用ENUM?ENUM是一个字符串对象,可以通过ENUM来限制字段的取值范围。如果插入数据时该字段的值不是可选值之一,则空字符串或NULL将替换用户要插入的值。比如我们可以在建表的时候使用ENUM来限制用户性别的取值范围只能是男性或者女性,但是在插入的时候是保密的。此时由于没有输入性别的取值范围,所以性别字段会保存为空字符串或NULL。当然,不建议使用ENUM来限制数据库中的取值范围,因为其实有很多坑。比如ENUM使用下标获取值,但是下标是从1开始的,因为0是为空字符串保留的,或者说ENUM中的0和“0”是不一样的。如果用0作为下标来操作,会报错,因为ENUM下标是从1开始的。如果用“0”来操作,最后会插入一个空字符串,因为下标0是为空字符串保留的.因此不推荐使用ENUM在数据库层面限制字段的取值范围。Mysql中的存储引擎其实支持Mysql中的很多存储引擎。Mysql不仅可以支持NDB、InnoDB事务安全表的存储引擎,还可以支持MyISAM、MEMORY、CSV、BLACKHOLE、FEDERATED等非事务安全表的存储引擎。.Mysql中主要有四种存储引擎:InnoDB、MyISAM、MEMORY和BLACKHOLE。InnoDB:Mysql5.6默认的存储引擎,支持外键约束和行级锁。如果数据操作除了insert和query之外还包括很多update和delete操作,那么InnoDB存储引擎更合适。InnoDB除了可以有效减少删除和更新带来的锁,还可以保证事务的完整提交和回滚。MyISAM:MyISAM不支持事务和外键,但它的优点是访问速度快。但由于表级锁在读写负载方面限制了它的性能,所以常用于只读或基于读的数据场景。并且场景需要对事务的完整性和并发性要求不高。MEMORY:将所有数据存储在内存中。内存访问数据非常快,因为它的数据存储在内存中,默认使用HASH索引。但是,一旦服务关闭,表中的数据就会丢失。BLACKHOLE:黑洞存储引擎,只接收不保存数据。对此类引擎的表的查询通常会返回一个空集。可以应用于主从复制中的分发Master。mysql中char和varchar的区别?char:定长,一般用于定长数据存储。比如手机号码。存取效率高。最大存储容量为255个字符。varchar:可变长度,可以节省空间。varchar需要在数据前使用一两个字节来存储数据的长度。最多可存储65532个字符。主键、超级键和候选键有什么区别?主键:主键其实刚才已经讲过了。一张数据表只能设置一个主键,可以唯一标识一条数据,但也可以将多列组合为主键。超键:凡是能唯一标识一个数据表的都可以作为超键。候选键:不包含冗余属性的超键,即去掉任何属性的候选键不再是超键。举个简单的例子帮助理解:student表中的每个学生都有学号、性别、年龄、姓名、专业。明显的学号作为主键存在,在学生表中不允许重复。{学号}、{学号、姓名}、{学号、性别}、{姓名、专业}的组合可以唯一标识一个学生的存在,所以这些组合可以成为superkeys,但是这两个组合{studentnumber,name},{studentnumber,gender}可以通过去掉姓名或性别只留下一个学号来识别学生的存在。所以这两个组合不是候选键。Mysql中的锁机制其实比其他数据库简单。MyISAM存储引擎和MEMORY存储引擎支持表级锁。InnoDB存储引擎支持行级锁和表级锁。但是,默认情况下使用行级锁。也就是我们常说的共享锁和互斥锁。从锁的角度来说,表级锁适合查询,行级锁更适合基于索引条件的大量并发更新。当然最重要的是防止死锁。数据库三种范式的第一种范式:属性是不可分的。第二范式:每张数据表必须有一个主键,唯一标识整个数据表。第三范式:消除数据冗余,信息只存储在一个数据表中,不能存储在多个数据表中。然后通过外键关联。blob和text的区别?text:text为非二进制字符串,需要指定字符集,根据字符集进行校验和排序。只能存储纯文本,在长度不够的时候可以看成是对VARCHAR的扩展。Blob:Blob存储的是二进制数据,所以不需要进行字符集校验。由于二进制存储格式,blob除了可以存储文本信息外,还可以保存图片等信息。Blob在长度不够的情况下可以看作是VARBINARY的扩展。同点不允许有默认值。保存或检索数据不会删除尾随空格。必须使用索引前缀的长度对blob或文本进行索引。不同之处在于文本不区分大小写,而blob排序和比较以区分大小写的方式执行。text是非二进制字符串,blob存储二进制数据。text需要指定字符集,blob不需要字符集校验。Blob可以存储图片,而text只能存储纯文本文件。欢迎关注公众号:程序员周先森。文章原发于微信公众号,本平台不定时更新。
