一文了解Mysql
文章原创于公众号:程序猿周先森。本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号。
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的更多相关文章
- 一文了解MySQL性能测试及调优中的死锁处理方法,你还看不明白?
一文了解MySQL性能测试及调优中的死锁处理方法,你还看不明白? 以下从死锁检测.死锁避免.死锁解决3个方面来探讨如何对MySQL死锁问题进行性能调优. 死锁检测 通过SQL语句查询锁表相关信息: ( ...
- 一文说尽MySQL事务及ACID特性的实现原理
MySQL 事务基础概念 事务(Transaction)是访问和更新数据库的程序执行单元:事务中可能包含一个或多个 sql 语句,这些语句要么都执行,要么都不执行.作为一个关系型数据库,MySQL 支 ...
- 一文说尽 MySQL 优化原理
说起MySQL的查询优化,相信大家收藏了一堆奇技淫巧:不能使用SELECT *.不使用NULL字段.合理创建索引.为字段选择合适的数据类型..... 你是否真的理解这些优化技巧?是否理解其背后的工作原 ...
- 一文学会MySQL的explain工具
开篇说明 (1) 本文将细致介绍MySQL的explain工具,是下一篇<一文读懂MySQL的索引机制及查询优化>的准备篇. (2) 本文主要基于MySQL5.7版本(https://de ...
- [好文分享]MySQL 加锁处理分析
原文转自:http://hedengcheng.com/?p=771 背景 MySQL/InnoDB的加锁分析,一直是一个比较困难的话题.我在工作过程中,经常会有同事咨询这方面的问题.同时,微博上也经 ...
- 一文讲清楚MySQL事务隔离级别和实现原理,开发人员必备知识点
经常提到数据库的事务,那你知道数据库还有事务隔离的说法吗,事务隔离还有隔离级别,那什么是事务隔离,隔离级别又是什么呢?本文就帮大家梳理一下. MySQL 事务 本文所说的 MySQL 事务都是指在 I ...
- 一文解决MySQL时区相关问题
前言: 在使用MySQL的过程中,你可能会遇到时区相关问题,比如说时间显示错误.时区不是东八区.程序取得的时间和数据库存储的时间不一致等等问题.其实,这些问题都与数据库时区设置有关,本篇文章将从数据库 ...
- 【网络好文】---MySQL为Null导致的四大坑
正式开始之前,我们先来看下 MySQL 服务器的配置和版本号信息,如所示: select version(); -- 版本为 8.0.22 "兵马未动粮草先行",看完了相关的配置之 ...
- 一文了解MySQL的Buffer Pool
摘要:Innodb 存储引擎设计了一个缓冲池(Buffer Pool),来提高数据库的读写性能. 本文分享自华为云社区<MySQL 的 Buffer Pool,终于被我搞懂了>,作者:小林 ...
随机推荐
- HDFS之Qurom Journal Manager(QJM)实现机制分析
前言 1.1背景 自从hadoop2版本开始,社区引入了NameNode高可用方案.NameNode主从节点间需要同步操作日志来达到主从节点元数据一致.最初业界均通过NFS来实现日志同步,大家之所以选 ...
- hive学习笔记之-数据类型
数据类型 Hive基本的数据类型: Hive集合数据类型: 另外还有一个复合数据类型,可以综合上面的数据类型组合到一起. · union: UNIONTYPE<data_typ ...
- 多线程——Runnable接口
以实现Runable接口的方式创建线程比继承Thread类有很大的优越性,因为类不能多重继承,即一个类只能继承一个类,那么如果该类已经继承了一个类,就不能实现多线程了,但是可以通过实现Runable接 ...
- 新建web工程
1.选择新建Dynamic Web Project 2.选择服务器和版本(2.5) 3.WebContend目录下新建一个html文件 4.运行 工程的目录结构: WEB-INF目录时受保护的,不能 ...
- iOS 13 正式发布,来看看有哪些 API 变动
iOS 13 已正式发布,网上对其用户体验上的新特性的描述也很多.对于开发来说,需要关注的另一方面是新系统在 API 层面做了哪些改动,从而会对我们现有的代码产生什么影响. 在这里,我们基于 iOS ...
- The 10 Most Important Linux Commands/10个最经常使用的命令行
1. ls 命令:to show all of the major directiories filed under a given file system. for example: ls /app ...
- 自己动手实现springboot配置(非)中心
好久没写博客了,这段时间主要是各种充电,因为前面写的一些东西,可能大家不太感兴趣或者是嫌弃没啥技术含量,所以这次特意下了一番功夫.这篇博客其实我花了周末整整两天写好了第一个版本,已经开源出去了,同样是 ...
- Django-多对多关系的三种创建方式-forms组件使用-cookie与session-08
目录 表模型类多对多关系的三种创建方式 django forms 组件 登录功能手写推理过程 整段代码可以放过来 forms 组件使用 forms 后端定义规则并校验结果 forms 前端渲染标签组件 ...
- 【linux】【ELK】利用elasticproxy对elasticsearch进行二次排序
做过elk的人应该了解kibana排序至支持到秒级别,但同一秒内出现多个日志的时候那么kibana展示的日志就会混轮,加上该代理可以解决该问题 # 拉取elasticproxy镜像 [root@loc ...
- UnicodeDecodeError: 'gbk' codec can't decode byte 0xb0 in position 279: illegal multibyte sequence
with open(r'E:\yy\mysql.txt') as wk: print(wk.readlines()) Traceback (most recent call last): File & ...