这是我参与「第五届青训营 」伴学笔记创作活动的第 15 天
InnoDB简介
InnoDB是事务型存储引擎,具有高可靠和高性能的特点。
- 支持ACID模型:原子性、一致性、隔离性和持久性
- 支持行级锁和快照读,提高了多事务并发和性能
- 支持聚集索引,最小化磁盘I/O从而加速主键查询
- 支持外键约束,确保插入、更新和删除不影响数据完整性
InnoDB最佳实践
- 为每一张表指定主键或使用自增主键
- 基于相同ID的多表查询尽量使用join
- 关闭autocommit
- 使用事务批量提交DML操作
- 使用
SELECT ... FOR UPDATE锁行 而不是使用LOCK TABLES锁表 - 不要关闭
innodb_file_per_table变量 - 你可以压缩
InnoDB表格而不损失读写能力 - 使用
--sql_mode=NO_ENGINE_SUBSTITUTION来避免使用你不喜欢的引擎创建表格
InnoDB 和 ACID
- A: atomicity
- C: consistency
- I: isolation
- D: durability
原子性
每个事务都是一个整体,要么所有的变更都被提交,要么所有已完成的变更都被回滚,不存在完成一半的事务。
一致性
数据库中的数据无时无刻保持一致,要么查询到的都是老数据,要么查询到的都是新数据。
隔离性
不同事务会以一定的等级隔离起来,多个事务同时执行不应当互相影响。
持久性
事务的结果应该是持久的:一旦变更被提交,数据不会因为电源故障、系统宕机、数据竞争或其他原因丢失
数据类型
整数
整形变量一般在满足数据范围的需求下的选择占用空间最小的类型
如一些状态变量可以使用tinyint
如果业务规模较大,表的自增主键使用bigint
日期和时间
datetime占用8个字节,其值与时区无关,也就是说改变时区配置不会影响,可保存至毫秒级,可保存的时间范围大
timestamp占用4个字节,最多存储到2038年,时间精确到秒,依赖数据库设置的时区,可以设置自动更新 date类型只占3个字节,mysql内建了很多对应时间函数用户计算,date类型跟可以存储到9999-12-31号
字符串类型
char是定长的字符串,最大长度255,char类型会自动删除末尾的空格、查询效率比varchar高,一般用于存储消息摘要,MD5哈希值,以及短字符串、经常更新的字符串
相对于固定长度的char,varchar(n)会根据内容的长度保存数据,当n小于255时使用一个字节来保存数据,否则使用两个字节。在mysql5.6之前变更长度时可能导致锁表。
varchar是使用非常频繁的类型,常见的场景有:
- 存储长度波动大的数据,比如文章内容
- 字符串多查询但很少更新的场景
- 特殊字符,如汉字,表情等
主键的选择
- 代理主键 即与业务无关的、无意义的随机数字序列,如无符号自增ID或雪花算法
- 自然主键 事物自身属性中的唯一标识,比如人的身份证号码
一般情况下我们会使用代理主键,这样与业务耦合度低,更容易维护。
字符集
如果不需要存储汉字,表情等特殊字符,选latin1,这样会节省大量的存储空间。 如果需要使用 utf 或者 unicode 建议对某列单独设置,防止不必要的空间浪费。 如果需要存储emoji选择utfbm64否则utf-8就足够使用了。