mysql 隔离级别
四种
read uncommitted 未提交读
read committed 提交读
repeatable read 可重复读
serializable 可串行化
多版本并发控制 MVCC
MVCC只在可重复读和提交读 2个隔离级别工作 因为未提交读 总是读取最新的数据行,而不符合当前事务版本的数据行。
可串行化则会对所有的读取行都加锁
数据类型优化
1选择更小的数据类型通常更好 。如果没法确定哪个数据类型是最好的 就选择你认为不会超过范围的最小类型
2 简单就好 。 整型比字符型代价更低,应该用mysql内建函数,而不是字符串类型来存储日期和时间;用整型存储ip地址
3尽量避免null ,可把null改为not null
整数类型 占用存储空间
tinyint 8 无符号 0~255 有符号 -128~127
smallint 16
mediumint 24
int 32
bigint 64
实数类型 带有小数部分的数字
decimal 可以存比bigint 还大的整数 用于存储精确的小数
float 使用4个字节存储 double占用8个字节
decimal 比 float 有更高的精确度和更大的范围
decimal 适合金融、财务等一般对范围要求比较小但是精确性要求高的数据
字符串类型
varchar是可变的,会节省空间
char是定长的,char适合存储很短的字符串,比如存储md5加密 char在效率上优于varchar
blob和text mysql不能将blob和text列全部长度的字符串进行索引
使用枚举enum 代替字符串类型
日期时间函数
unix_timestamp() 将年月日时分秒转换为int时间戳
from_unixtime() 将时间戳转换为年月日
特殊类型数据
人们经常用varchar(15) 列来存储ip地址 (这样的话不太合适)
但是使用bigint(8) 只需要8个字节 相差了7个字节
存ip时可以用inet_aton();
取ip时可以用inet_ntoa();这样效率提高了很多
范式化与反范式化
3范式
1数据库表的每一列都是不可分割的原子数据项<列不可分,第一范式就是无重复的域>
2要求实体的属性完全依赖于主关键字,所谓完全依赖是指不能存在仅依赖主关键字一部分的属性。
3任何非主属性不依赖于其他非主属性