本文转载于 SegmentFault 社区
作者:哈基石
MySQL
基础部分
Char 和 Varchar 数据类型的差别差别
char 类型用于存储定长字符串,varchar存储可变长子字符串
varchar 需要1-2个字节存储长度信息
char 在存储的时候会补空格到达指定长度来存储,varchar 则不需要
char 在检索的时候会删除尾部的空格(可增加配置参数 PAD_CHAR_TO_FULL_LENGTH 保留尾缀空格)
char 的存取速度要比 varchar 快,而 varchar 的空间利用率会更高
参考文档:https://mp.weixin.qq.com/s/qkfIJwLHCj4b1IqbZk-7IQ
MySQL 的数据类型
整数类型
整数类型(whole number)
tinyint、smallint、medinuint、int和bigint,分别使用8,16,24,32,64位存储空间。含有可选 unsigned 属性,表示不允许为负数实数类型(real number)
是带有小数部分的数字,float和double decimal只是一种存储类型
字符串类型
varchar 和 char
如何存储在硬盘和内存中与存储引擎有关。
varchar(200)与char(5)存储hello 的开销事一样的,使用 char 会更有优势,更长的列会消耗更多的内存,因为 MySQL 通常会分配固定大小的内存来保存内部值。最好只分配真正需要的空间BLOB 和 TEXT 类型
BLOB 和 TEXT 都是为存储很大的数据而设计的字符串类型,分别采用二进制和字符方式存储
枚举(ENUM)类型
枚举可以把一些不重复的字符串存储成一个预定义的集合。MySQL 存储枚举的值非常进程,会将列表值的数量雅座到一个或两个文件中。MySQL 真正存储的是整数,而不是字符串。
在特殊情况下,把 char/varchat 列与枚举列进行关联,可能比 char/varchar 关联要慢
BLOB 与 TEXT 之间不同事 BLOB 类型存储的是二进制数据,没有排序规则或字符集。而 TEXT 类型有字符集和排序规则
日期和时间类型
MySQL 能存储的最小时间粒度为秒(可以使用微秒级的粒度进行临时运算)
datetime表示范围到9999年,而 timestamp 表示范围到2038年。
timestamp 占用4字节,datetime 占用8字节。timestamp 在时间处理上更方便一些参考地址:https://segmentfault.com/a/119000001739360
事务的特性 ACID
原子性(atomicity) 一个事务为不可分割的最小工作单元,要么全部提交成功,要么全部回滚,不可能只执行一部分,这就是事务的原子性
一致性(consistency) 数据库从一个一致性状态切换到另一个一致性状态
隔离性(isolation) 一个事务在提交之前,对其他事务是不可见的。
永久性(durability) 一旦事务提交,那么所做的修改将会永久存储在数据库中
事务的隔离级别
隔离级别的定义
READ UNCOMMITED(未提交读)脏读
事务中的修改即使没有提交,对其他事务都是可见的。会出现脏读(Dirty Read)的情况。READ COMMITTED (提交读)不可重复读
一个事务从开始直到提交之前,所做的任何修改对其他事务都是不可见的。也叫做不可重复读(nonrepeatable read),因为两次同样的查询,可能会存在不同的结果REPEATABLE READ(可重复读)MySQL 默认的事务隔离级别
当某个事务在读取某个范围内的记录时,另外一个事务在这个范围内插入了新的记录,当之前的事务再次读取这个范围内的数据时,会产生幻行(Phantom Row)称为幻读
也可以说 一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据,这种现象称为“幻读”。SERIALIZABLE (可串行化)最高的隔离级别
在读取的每一行数据都上锁。导致导量的超时和等待锁的问题。
隔离级别的列表
隔离级别 脏读 幻读 不可重复读
未提交读(RUC) 是 是 是
已提交读(RC) 否 是 是
可重复读(RR) 否 是 否
可串行化 否 否 否
> 参考地址:https://segmentfault.com/a/1190000016680062
脏读 一个事务读取到了另一个事务未提交的数据
幻读 幻读就是一个事务读到了另一个事务insert的数据
不可重复读
不可重复读就是多次读取统一数据返回的结果不一致。同脏读不同,这是读取已经提交的数据;同幻读也不同,这边是更新数据,幻读是插入数据。
MySQL 锁的基本类型
读写锁
读锁也叫共享锁,相互不堵塞
写锁也叫排它锁,一个写锁会阻塞其他的读锁和写锁
锁粒度
表锁:开销小,加锁快;不会出现死锁;锁定力度大,发生锁冲突概率高,并发度最低
行锁:开销大,加锁慢;会出现死锁;锁定粒度小,发生锁冲突的概率低,并发度高
页锁:开销和加锁速度介于表锁和行锁之间;会出现死锁;锁定粒度介于表锁和行锁之间,并发度一般
参考地址:
https://zhuanlan.zhihu.com/p/29150809
https://segmentfault.com/a/1190000011460640
https://www.cnblogs.com/jpfss/p/8890250.html
https://segmentfault.com/a/1190000016685629