字段属性
| 类型 | 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), 可以在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数。