数据库和缓存(一)

一、存储引擎

  1. MyISAM

    • 是MySQL默认的存储引擎,不支持事务、行级锁和外键
    • 执行速度快,占用内存和存储资源少
    • 用一个变量保存表的总行数,查总行数速度很快
    • 非聚集索引,数据文件是分离的,索引保存的是数据文件的指针,主键索引和辅助索引是独立的
    • 表存储在两个文件:MYD 和 MYI
    • 更新数据慢且不支持事务,查询速度快
  2. InnoDB

    • 提供了事务、外键、回滚、崩溃修复能力、多版本并发控制、事务安全等操作
    • 底层存储结构为B+树
    • 不保存表的总行数,执行 select count(*) from table 时需要全表扫描
    • 聚集索引,数据文件是和索引绑在一起的,必须要有主键,通过主键索引效率很高
    • 特点:插入缓冲(insert buffer);二次写(double write);自适应哈希索引(ahi);预读(read ahead)
    • 使用场景:数据经常更新,处理多重并发更新请求;支持事务;支持灾难恢复;外键约束;列属性自增
      数据库和缓存(一)
  3. TokuDB

    • 底层存储为Fractal Tree
    • 在线添加索引,不影响读写操作
    • 使用于写入速度快,访问频率不高的数据或历史数据归档
      数据库和缓存(一)
  4. Memory

    • 使用内存空间创建,支持数据持久化
    • 访问速度快,数据易丢失

二、创建索引原则

索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息

  • 中到大数据量表适合使用索引
  • 选择唯一性索引
  • 为经常需要排序、分组和联合的操作字段建立索引
  • 限制索引数量,太多会降低效率
  • 使用数据量少的索引
  • 选择区分度高的列作为索引
  • 索引列不参与计算

三、数据库三范式

  1. 第一范式:每列都是不可再分的最小数据单元,确保列的原子性
  2. 第二范式:在第一范式的基础上,表中的非主键列不存在对主键部分的依赖。eg. 若订单表Orders包含订单信息、产品信息,需将其划分为两个单独的表
  3. 第三范式:满足一、三范式,且表中的列不存在对非主键列的传递依赖。

四、数据库事务

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相关

  1. 时间字段:
    • 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
  2. DATETIME和TIMESTAMP的区别
    • DATETIME 的日期范围是 1001——9999 年;TIMESTAMP 的时间范围是 1970——2038 年
    • DATETIME 存储时间与时区无关;TIMESTAMP 与时区有关
    • DATETIME 的存储空间为 8 字节;TIMESTAMP 的存储空间为 4 字节
    • DATETIME 的默认值为 null;TIMESTAMP 的字段默认不为空(not null),默认值为当前时间(CURRENT_TIMESTAMP)
  3. MySQL的存储过程:一组用于完成特定功能的SQL语句集合,存储在数据库中,经过一次编译后再次调用不需要再次编译,通过指定存储过程的名字并给出参数调用
  4. 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)

相关文章: