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

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. C++11新增容器以及元组

    上次说了C++11的部分新特性,这里我们来说说新增的容器. unordered_map unordered_set unordered_multimap unordered_multiset arra ...

  2. 基于 VMware 的超融合, 解析 vSAN 与 SmartX ZBS 的优劣差异

    在企业级IT领域从业多年,最近越来越多地听到圈内人谈论起超融合技术的种种好处.的确,超融合技术已越来越走向成熟,带来的价值也逐渐凸显.它可靠性高,资源消耗低,尤其是运维部署非常便捷.在企业基础架构领域 ...

  3. Fragment的创建与通信

    由于这里涉及到接口回调的问题,所以先来看一看什么是接口回调: 这就好比老板和员工的微妙关系,老板需要员工去工作,员工挣钱了以后还要告诉老板自己挣了多少钱,然后由老板来处理这些钱. 首先创建一个接口: ...

  4. 360大牛 全面解读 PHP面试

    360大牛全面解读PHP面试 第1章 课程介绍 让大家了解基本面试流程和面试的核心要求以及意义是什么并理解PHP面试考点主要以基础为核心,说明PHP面试考察范围. 第2章 PHP基础知识考察点 本章主 ...

  5. Day 2 总结

  6. 详细的App推广前的准备工作

    App开发完成后,推广App自然就成为下一步工作的重点.兵马未动,粮草先行,这里为大家整理了一份App推广前需要准备一些事项,希望能给正在准备开展App推广的小伙伴们一些帮助. 众所周知,App推广的 ...

  7. [C++] 空间配置器——allocator类

    1.new和delete有一些灵活性上的局限:new把内存分配和对象构造组合在了一起:delete将对象析构和内存释放组合在了一起.   2.当分配一大块内存时,我们通常计划在这块内存上按需构造对象, ...

  8. 夯实Java基础系列3:一文搞懂String常见面试题,从基础到实战,更有原理分析和源码解析!

    目录 目录 string基础 Java String 类 创建字符串 StringDemo.java 文件代码: String基本用法 创建String对象的常用方法 String中常用的方法,用法如 ...

  9. 商用hadoop集群的配置命令分布

    角色 安装 hdfs配置 yarn配置 hdfs 格式化 启动yarn服务 启动hdfs服务 master yum install hadoop-hdfs-namenode yum install h ...

  10. 数据分析--pandas的基本使用

    一.pandas概述 1.pandas是一个强大的Python数据分析的工具包,是基于NumPy构建的. 2.pandas的主要功能 具备对其功能的数据结构DataFrame.Series 集成时间序 ...