对于varchar和char,前者是可变长,后者固定,其中的数字都表明字符长度,char的长度在0~255,varchar存储字节数在0~65535.若是某个数据表里的数据行的长度是可变的,那么,为了节约存储空间,MySQL会把这个数据表里的固定长度类型的数据列转换为相应的可变长度类型.mysql
例外:长度小于4个字符的char数据列不会被转换为varchar类型
key_len:表示使用了索引的长度。长度由三个因素决定:算法
字段类型 | 占用字节数 |
---|---|
char(n) | n |
varchar(n) | n+2 |
tinyint | 1 |
smallint | 2 |
int | 4 |
bigint | 8 |
date | 3 |
timestamp | 4 |
datetime | 8 |
若是字段容许空则还要加一个字节。
若是有一个索引是联合索引 (a,b) a、b都是varchar(30)非null,编码是UTF8 那么若是索引都用上 长度为30*3+2+30*3+2=184 3是utf8占用3个字节sql
结构:分为聚簇索引和非聚簇索引,其中,除了主键以外,其余索引都是非聚簇索引。用的是B+树。
为何用B+树,而不是其余结构?先看看通常有什么结构:
哈希表数据库
有序列表安全
树并发
平衡二叉树:红黑树mvc
B树(多路平衡查找树(Balance Tree))函数
B+树高并发
以上就是选择B+树的缘由。
而聚簇索引和非聚簇索引的区别在于,聚簇索引会把整行数据都保存,非聚簇索引只保存索引相关字段数据,还有主键的地址。所以通常状况下,若是非聚簇索引不是覆盖索引,须要回表查找,才能获得须要的结果。工具
事务
事务隔离级别与锁
一共有如下四种隔离级别
不可重复读和幻读的区别:前者重点在于update和delete,后者重点在于insert。
锁的类型有不少,分类范畴也有不少,下面根据不一样的分类简单描述一下。
乐观锁和悲观锁
共享锁与排它锁
两段锁协议
将事务分红两个阶段,加锁阶段和解锁阶段(因此叫两段锁)
行锁、gap锁和next-key锁
gap锁
在索引记录之间的间隙中加锁,或者是在某一条索引记录以前或者以后加锁,并不包括该索引记录自己。gap lock的机制主要是解决可重复读模式下的幻读问题。
gap lock的前置条件:
next-key lock
即gap lock与record lock的结合,即除了锁住记录自己,还要再锁住索引之间的间隙
如下几种场景来分析在RR级别下锁的执行
概括在一个表以下:
死锁
产生死锁的条件:
避免死锁的产生的一些建议:
mvcc
当前读与快照读
隐式字段
InnoDB存储引擎在数据库每行数据的后面添加了三个字段:
undo log
在回滚段中的undo logs分为: insert undo log 和 update undo log
insert undo log : 事务对insert新记录时产生的undolog, 只在事务回滚时须要, 而且在事务提交后就能够当即丢弃。
update undo log : 事务对记录进行delete和update操做时产生的undo log, 不只在事务回滚时须要, 一致性读也须要,因此不能随便删除,只有当数据库所使用的快照中不涉及该日志记录,对应的回滚日志才会被purge线程删除
purge
从前面的分析能够看出,为了实现InnoDB的MVCC机制,更新或者删除操做都只是设置一下老记录的deleted_bit,并不真正将过期的记录删除。 为了节省磁盘空间,InnoDB有专门的purge线程来清理deleted_bit为true的记录。为了避免影响MVCC的正常工做,purge线程本身也维护了一个read view(这个read view至关于系统中最老活跃事务的read view);若是某个记录的deleted_bit为true,而且DB_TRX_ID相对于purge线程的read view可见,那么这条记录必定是能够被安全清除的。
read view(读视图)
可见性比较算法
设当前新开事务id为 new_id
当前新开事务建立的快照read view 中最先的事务id为up_limit_id, 最迟的事务id为low_limit_id(注意这个low_limit_id=未开启的事务id=当前最大事务id+1)
可见性算法案例分析
innodb的mvcc与理想mvcc区别
innodb算不上真正的mvcc,由于没有实现核心的多版本共存。其缘由是理想mvcc对多行数据无能为力。
譬如,若是事务A执行理想的MVCC, 修改Row1成功, 而修改Row2失败, 此时须要回滚Row1, 但由于Row1没有被锁定, 其数据可能又被事务B所修改, 若是此时回滚Row1的内容,则会破坏事务B的修改结果,致使事务B违反ACID。 这也正是所谓的 第一类更新丢失
的状况