数据库和缓存(一)
一、存储引擎
-
MyISAM
- 是MySQL默认的存储引擎,不支持
事务、行级锁和外键 - 执行速度快,占用内存和存储资源少
- 用一个变量保存表的总行数,查总行数速度很快
-
非聚集索引,数据文件是分离的,索引保存的是数据文件的指针,主键索引和辅助索引是独立的 - 表存储在两个文件:MYD 和 MYI
- 更新数据慢且不支持事务,查询速度快
- 是MySQL默认的存储引擎,不支持
-
InnoDB
- 提供了
事务、外键、回滚、崩溃修复能力、多版本并发控制、事务安全等操作 - 底层存储结构为B+树
- 不保存表的总行数,执行 select count(*) from table 时需要全表扫描
-
聚集索引,数据文件是和索引绑在一起的,必须要有主键,通过主键索引效率很高 - 特点:插入缓冲(insert buffer);二次写(double write);自适应哈希索引(ahi);预读(read ahead)
- 使用场景:数据经常更新,处理多重并发更新请求;支持事务;支持灾难恢复;外键约束;列属性自增
- 提供了
-
TokuDB
- 底层存储为Fractal Tree
- 在线添加索引,不影响读写操作
- 使用于写入速度快,访问频率不高的数据或历史数据归档
-
Memory
- 使用内存空间创建,支持数据持久化
- 访问速度快,数据易丢失
二、创建索引原则
索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息
- 中到大数据量表适合使用索引
- 选择唯一性索引
- 为经常需要排序、分组和联合的操作字段建立索引
- 限制索引数量,太多会降低效率
- 使用数据量少的索引
- 选择区分度高的列作为索引
- 索引列不参与计算
三、数据库三范式
- 第一范式:每列都是不可再分的最小数据单元,确保列的原子性
- 第二范式:在第一范式的基础上,表中的非主键列不存在对主键部分的依赖。eg. 若订单表Orders包含订单信息、产品信息,需将其划分为两个单独的表
- 第三范式:满足一、三范式,且表中的列不存在对非主键列的传递依赖。
四、数据库事务
ACID四大属性
- 原子性Atomicity:事务的逻辑块要么都做要么都不做
- 一致性Consistency:事务做完之后,数据都处于一致性,数据的完整性没被破坏
- 隔离性Isolation:对数据进行修改的所有并发事务都是隔离的,不影响其他事务
- 永久性Durability:对数据的修改会被持久化
事务控制:
- BEGIN或START TRANSACTION显示开启事务
- COMMIT提交事务
- ROLLBACK回滚
- SAVEPOINT identifier,创建保存点
- RELEASE SAVEPOINT identifier,删除保存点
- ROLLBACK TO identifier
- SET TRANSACTION设置事务的隔离级别
五、触发器
指一段代码,当触发某个事件时,自动执行这些代码。
MySQL 数据库中有六种触发器:
- Before Insert
- After Insert
- Before Update
- After Update
- Before Delete
- After Delete
六、MySQL相关
- 时间字段:
- DATETIME:8 bytes YYYY-MM-DD HH:MM:SS
- TIMESTAMP:4 bytes YYYY-MM-DD HH:MM:SS
- DATE:4 bytes YYYY-MM-DD
- TIME:3 bytes HH:MM:SS
- YEAR:1 byte YYYY
- DATETIME和TIMESTAMP的区别
- DATETIME 的日期范围是 1001——9999 年;TIMESTAMP 的时间范围是 1970——2038 年
- DATETIME 存储时间与时区无关;TIMESTAMP 与时区有关
- DATETIME 的存储空间为 8 字节;TIMESTAMP 的存储空间为 4 字节
- DATETIME 的默认值为 null;TIMESTAMP 的字段默认不为空(not null),默认值为当前时间(CURRENT_TIMESTAMP)
- MySQL的存储过程:一组用于完成特定功能的SQL语句集合,存储在数据库中,经过一次编译后再次调用不需要再次编译,通过指定存储过程的名字并给出参数调用
- MySQL的数据类型:
- 整数:TINYINT(1)/SMALLINT(2)/MEDIUMINT(3)/INT(4)/BIGINT(8)
- 实数:FLOAT/DOUBLE/DECIMAL
- 字符串:CHAR/VARCHAR/TEXT/BLOB
- 枚举:ENUM
- 日期:YEAR(1)/TIME(3)/DATE(4)/TIMESTAMP(4)/DATETIME(8)