mysql笔记

207 阅读2分钟

字段属性

类型 m范围 m含义 占用字节 值范围
tinyint(m) 1-255 zerofill补全 1 -128 - 127 / 0 - 255
samllint(m) 1-255 zerofill补全 2 -2^15 - 2^15-1 / 0 - 2^16-1
mediumint(m) 1-255 zerofill补全 3 -2^23 - 2^23-1 / 0 - 2^24-1
int(m) 1-255 zerofill补全 4 -2^31 - 2^31-1 / 0 - 2^32-1
bigint(m) 1-255 zerofill补全 8 -2^63 - 2^63-1 / 0 - 2^64-1
varchar(m) 0-21845 字符串长度(0只能存null) 数字字母1 utf8汉字3 0-21845
char(m) 0-255 字符串长度(0只能存null) 数字字母1 utf8汉字3 0-255
mysql版本5.7
int型存小数自动四舍五入

mvvc

InnoDB在每行数据都增加两个隐藏字段,一个记录创建的版本号,一个记录删除的版本号。

事务隔离级别

读未提交

读已提交

可重复读

串行话

索引结构

b树和b+树

多叉树就是每个节点有多个儿子,儿子之间的大小保证从左到右递增
InnoDB的一个整数字段索引为例,这个N差不多是1200。
这棵树高是4的时候,就可以存1200的3次方个值,这已经17亿了。
考虑到树根的数据块总是在内存中的,一个10亿行的表上一个整数字段的索引,查找一个值最多只需要访问3次磁盘。
其实,树的第二层也有很大概率在内存中,那么访问磁盘的平均次数就更少了。

回表

select * from T where k between 3 and 5 查询过程

在k索引树上找到k=3的记录,取得 ID = 300;

再到ID索引树查到ID=300对应的R3;

在k索引树取下一个值k=5,取得ID=500;

再回到ID索引树查到ID=500对应的R4;

在k索引树取下一个值k=6,不满足条件,循环结束。

覆盖索引

如果执行的语句是select ID from T where k between 3 and 5,这时只需要查ID的值,而ID的值已经在k索引树上了,因此可以直接提供查询结果,不需要回表。也就是说,在这个查询里面,索引k已经“覆盖了”我们的查询需求,我们称为覆盖索引。

索引下推

在MySQL 5.6之前,只能从ID3开始一个个回表。到主键索引上找出数据行,再对比字段值。
而MySQL 5.6 引入的索引下推优化(index condition pushdown), 可以在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数。