数据库
郭旭升 Lv6

事务ACID特性

事务是由一系列数据库操作组成的一个完整的逻辑过程。如银行转账。一个完整的逻辑过程,不可拆分,这个过程叫事务。 具有ACID特性。

  • 原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成。
  • 一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。
  • 隔离性:隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。
  • 持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

事务隔离的级别:()

  1. 读未提交(Read uncommitted):脏读、不可重复读、幻读都可能出现
  2. 读提交(read committed): 可以避免脏读。
  3. 可重复读(repeatable read):避免脏读、不可重复读,但是会幻读。
  4. 串行化(Serializable):性能很低、事务顺序执行、避免脏读、不可重复读、和幻读问题。
    隔离级别从低到高,性能逐渐减低、但是事务数据一致性增高。

脏读、不可重复读、幻读

  • 脏读:事务2查看了事务1未提交的更新事务,结果事务1回滚了,就是脏读。
  • 幻读: 事务2在事务1的两次查询之间插入了新的值,导致两次数据(条数、量)不一致。
  • 不可重复读:事务2在事务1的两次查询之间更新了新的值,导致查询结果不一致。

手写常用语句

条件查询
关联查询
排序查询
分组查询
逻辑关键字
常用函数(count、sum、order by)

数据类型

整数型
浮点型
字符串
二进制
时间

存储引擎(特点)

MyIASM 支持全文检索,查询效率高; 不支持事务, 使用表级锁
InnoDB 支持ACID事务,支持外键、行级锁, 使用行级锁,提高了并发效率

  • 表锁
    粒度大,锁冲突几率大,
  • 行级锁
    锁的粒度小,并发冲突几率低,并发效率高
  • 共享锁
  • 排他锁

索引

大幅增加数据库的查询性能,需要额外的空间来存储索引,
适合应用到读多写少的场景。

  • 类型:
  1. 唯一索引

  2. 主键索引 不允许空值

  3. 普通索引

  4. 联合索引 注意最左原则

  5. 全文索引 (MyISAM) 5.6版本之后 InnoDB也实现了全文索引

  • 索引实现
  1. B-Tree
  2. R-Tree
  3. Hash 散列表 效率高,但不支持范围查找,实际使用较少。
  4. FullText 记录关键字与对应文档的倒排索引

存储过程与函数

避免重复编写语句

  • 存储过程

  • 函数

新特性(8.0)

隐藏索引、通用表表达式、窗口函数()

优化

  1. 表结构与索引
  2. SQL语句优化
  3. 参数优化
  4. 硬件及系统配置
    优化成本逐渐升高,但是优化效果 逐渐降低
  • 表结构与索引优化
  1. 分库分表,读写分离
  2. 为字段选择合适的数据类型, 尽可能小
  3. 字段多的表分解成多个表
  4. 为经常使用查询的创建索引
  5. 列字段尽量设置not null
  • SQL语句优化
  1. 找到最需要优化的查询语句:使用频率最高、优化后提高最明显的语句。(分析慢查询日志)
  2. 使用分析工具:explain、profile
  3. 避免使用Select * ,指定需要获取的字段(避免查询列字段的元信息)
  4. 尽量使用prepared statements (性能更好、防止SQL注入)
  5. 使用索引扫描来排序
 Comments