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

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只能储存纯文本文件。

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

一文了解Mysql的更多相关文章

  1. 一文了解MySQL性能测试及调优中的死锁处理方法,你还看不明白?

    一文了解MySQL性能测试及调优中的死锁处理方法,你还看不明白? 以下从死锁检测.死锁避免.死锁解决3个方面来探讨如何对MySQL死锁问题进行性能调优. 死锁检测 通过SQL语句查询锁表相关信息: ( ...

  2. 一文说尽MySQL事务及ACID特性的实现原理

    MySQL 事务基础概念 事务(Transaction)是访问和更新数据库的程序执行单元:事务中可能包含一个或多个 sql 语句,这些语句要么都执行,要么都不执行.作为一个关系型数据库,MySQL 支 ...

  3. 一文说尽 MySQL 优化原理

    说起MySQL的查询优化,相信大家收藏了一堆奇技淫巧:不能使用SELECT *.不使用NULL字段.合理创建索引.为字段选择合适的数据类型..... 你是否真的理解这些优化技巧?是否理解其背后的工作原 ...

  4. 一文学会MySQL的explain工具

    开篇说明 (1) 本文将细致介绍MySQL的explain工具,是下一篇<一文读懂MySQL的索引机制及查询优化>的准备篇. (2) 本文主要基于MySQL5.7版本(https://de ...

  5. [好文分享]MySQL 加锁处理分析

    原文转自:http://hedengcheng.com/?p=771 背景 MySQL/InnoDB的加锁分析,一直是一个比较困难的话题.我在工作过程中,经常会有同事咨询这方面的问题.同时,微博上也经 ...

  6. 一文讲清楚MySQL事务隔离级别和实现原理,开发人员必备知识点

    经常提到数据库的事务,那你知道数据库还有事务隔离的说法吗,事务隔离还有隔离级别,那什么是事务隔离,隔离级别又是什么呢?本文就帮大家梳理一下. MySQL 事务 本文所说的 MySQL 事务都是指在 I ...

  7. 一文解决MySQL时区相关问题

    前言: 在使用MySQL的过程中,你可能会遇到时区相关问题,比如说时间显示错误.时区不是东八区.程序取得的时间和数据库存储的时间不一致等等问题.其实,这些问题都与数据库时区设置有关,本篇文章将从数据库 ...

  8. 【网络好文】---MySQL为Null导致的四大坑

    正式开始之前,我们先来看下 MySQL 服务器的配置和版本号信息,如所示: select version(); -- 版本为 8.0.22 "兵马未动粮草先行",看完了相关的配置之 ...

  9. 一文了解MySQL的Buffer Pool

    摘要:Innodb 存储引擎设计了一个缓冲池(Buffer Pool),来提高数据库的读写性能. 本文分享自华为云社区<MySQL 的 Buffer Pool,终于被我搞懂了>,作者:小林 ...

随机推荐

  1. Java第三次作业第四题

    4. [问题描述]读取一个文本文件in.txt,然后将这个文件的内容,反序写到另一个文件out.txt中. [输入形式]从文件in.txt中读信息. [输出形式]反序内容写入out.txt文件中. [ ...

  2. TestNG(一) TestNG实战在idea中创建module

    1.在ider里创建一个Module 2.直接点击下一步 3.输入Groupld h和Artifactid名称,点击下一步 4.点击Finish 创建完成

  3. python+selenium十:selenium的二次封装

    python+selenium十:基于原生selenium的二次封装   from selenium import webdriverfrom selenium.webdriver.support.w ...

  4. iOS上架的整体流程和建议

    App Store上架指的是iOS应用从提交申请到上线的整个过程,它的目的是让应用展示在App Store上获取流量.用户. 一.iOS上架的整体流程 1.申请开发者账号 苹果的开发者账号主要分为三种 ...

  5. java反射机制,以及对反射机制的了解

    反射是什么?反射有什么用?我相信大家在开始学的时候都会有疑惑,直到如今我学的还不够深入只能简单的说说反射的作用,理论的我也听得很迷糊,接下来我就以几个例子来 写写反射的用处: 494696003群,有 ...

  6. [sonarqube的使用] sonarqube安装

    一 . SonarQube代码质量检查工具简介 Sonar (SonarQube)是一个开源平台,用于管理源代码的质量 Sonar 不只是一个质量数据报告工具,更是代码质量管理平台 支持Java, C ...

  7. rocketmq学习(二) rocketmq集群部署与图形化控制台安装

    1.rocketmq图形化控制台安装 虽然rocketmq为用户提供了使用命令行管理主题.消费组以及broker配置的功能,但对于不够熟练的非运维人员来说,命令行的管理界面还是较难使用的.为此,我们可 ...

  8. freemarker常见语法

    FreeMarker的插值有如下两种类型:1,通用插值${expr};2,数字格式化插值:#{expr}或#{expr;format}  ${basketball.name?if_exists } / ...

  9. 夯实Java基础系列17:一文搞懂Java多线程使用方式、实现原理以及常见面试题

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  10. python 处理excel踩过的坑——data_only,公式全部丢失

    用openpyxl读取excel的load_workbook有个data_only参数. yb_wb = load_workbook(u"D:\\Desktop\\xxx.xlsx" ...