掌握Mysql:一篇文章就够了

发表时间: 2019-10-23 17:31

文章原创于公众号:程序猿周先森。本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号。

Redis系列到上一篇已经全部结束了,从本篇开始进入Mysql系列文章专题。本篇作为Mysql系列专题的开篇文章,主要是一文带大家大致了解什么是Mysql。本篇文章主要涉及的内容有:

  • 什么是数据库?
  • 数据库中的几个基本术语?
  • Mysql中InnoDB引擎支持的4种事务隔离级别
  • Mysql中如何使用ENUM?
  • Mysql中的存储引擎
  • mysql中char与varchar的区别?
  • 主键和候选键的区别?
  • blob和text的区别?
  • Mysql中的锁
  • 数据库三范式

什么是数据库?

数据库其实顾名思义就是存储数据的仓库,数据库可以存储上亿条数据,而数据的来源也很多,比如系统的消费记录,发送的消息记录等文本类型的数据,当然数据也可以是图形或者音乐等其他格式的数据。数据库是按照特定的数据结构来组织,存储和管理数据的仓库,实际上数据库的本质一样是将数据存储在磁盘中的本地文件中,只不过对外提供了API,所以不需要我们编写操作数据文件的指令。而关系型数据库使用最为广泛的莫过于Oracle、Mysql以及SQL Server。我这里是以Mysql作为基础进行讲解。

数据库中的几个基本术语

  • 数据库:存储数据的仓库,是一些关联表的集合。
  • 数据表:是数据的矩阵,可以理解为电子表格。
  • 数据表中的列:表示一个属性,比如用户名。
  • 数据表中的行:表示一行数据,比如用户表中指定一个用户的用户信息。
  • 主键:一个数据表只能够设置一个主键,可以唯一标识一条数据,但是可以多个列组合当成主键使用。

InnoDB引擎支持的4种事务隔离级别

InnoDB引擎支持的4种事务隔离级别分别是:读未提交、读已提交、可重复读、串行读。

  • 读未提交:允许脏读,可以读取其他session中未提交的脏数据。
  • 读已提交:不可读取其他session尚未提交的数据,只有其他session数据已提交才能读取到,为不重复读。
  • 可重复读:该级别下可重复读,InnoDB引擎默认采用可重复读,不允许读取还未提交的脏数据,但是可能存在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默认的存储引擎,支持外键约束和行级锁。如果数据操作除了插入和查询之外,还包括很多更新和删除操作,那么InnoDB存储引擎是比较合适的。InnoDB除了有效的降低由删除和更新导致的锁定,还可以确保事务的完整提交和回滚。

  • MyISAM:MyISAM不支持事务、外键,但是优势是访问速度快,不过由于表级别的锁定限制了它在读写负载方面的性能,因此它经常应用于只读或者以读为主的数据场景,并且场景需要对事务的完整性、并发性要求不高。
  • MEMORY:在内存中存储所有数据,Memory访问数据非常快,因为它的数据是存放在内存中的,并且默认使用HASH索引,但是一旦服务关闭,表中的数据就会丢失。
  • BLACKHOLE:黑洞存储引擎,只接收但却并不保存数据。对这种引擎的表的查询常常返回一个空集。可以应用于主从复制中的分发主库。

mysql中char与varchar的区别?

  • char:定长,一般用于固定长度的数据存储。比如手机号。存取效率高。存储容量最多为255个字符数。
  • varchar:不定长,可以节省空间。varchar需要在数据之前使用一到两个字节存储数据长度。最多情况下可以存储65532个字符数。

主键、超键和候选键的区别?

  • 主键:主键刚才其实已经讲过了,一个数据表只能够设置一个主键,可以唯一标识一条数据,但是可以多个列组合当成主键使用。
  • 超键:能唯一标识数据表的都可以作为超键。
  • 候选键:不含有多余属性的超键,也就是候选键去掉任何一个属性都不再属于超键。

我们举个简单的例子助于理解:

学生表中每个学生都有学号,性别,年龄,姓名,专业。显而易见的学号是作为主键存在的,在学生表中是不允许重复的,{学号},{学号,姓名},{学号,性别},{姓名,专业}这些组合都可以唯一标识一个学生的存在,所以这些组合都可以成为超键,但是{学号,姓名},{学号,性别}这两个组合去掉姓名或者性别只留下一个学号一样可以标识一个学生的存在,所以这两个组合不是候选键。

Mysql中的锁

Mysql锁机制其实相对其他数据库更为简单,MyISAM存储引擎以及MEMORY存储引擎支持表级锁,InnoDB存储引擎支持行级锁和表级锁,但是默认情况下是采用行级锁,也就是我们常说的共享锁和互斥锁。从锁的角度来说,表级锁适合查询为主,行级锁更适合有大量按索引条件并发更新数据。当然最重要的是一定要防止出现死锁现象。

数据库三范式

  • 第一范式:属性不可分割。
  • 第二范式:每个数据表必须拥有主键,并且唯一标识整个数据表。
  • 第三范式:消除数据冗余,信息只在一个数据表存储,不能存储在多张数据表。然后通过外键进行关联。

blob和text的区别?

  • text:text是非二进制字符串,并且需要指定字符集,并按照该字符集进行校验和排序。只能存储纯文本,可以看作是VARCHAR在长度不足时的扩展。
  • blob:blob存储的是二进制数据,因此无需字符集校验,blob除了存储文本信息外,由于二进制存储格式,所以还可以保存图片等信息,blob可以看作是VARBINARY在长度不足时的扩展。

相同点

  • 都不允许有默认值。
  • 保存或检索数据不删除尾部空格。
  • 索引在blob或者text上必须执行索引前缀的长度。

不同点

  • text大小写不敏感,而blob排序和比较以大小写敏感的方式执行。
  • text是非二进制字符串,blob存储的是二进制数据。
  • text需要指定字符集,blob无需字符集校验。
  • blob可以储存图片, text只能储存纯文本文件。

欢迎关注公众号:程序猿周先森。文章原创于微信公众号,本平台不定时更新。