MySql

199 阅读3分钟

知识图谱

三范式

  1. 属性不可切割
  2. 不能存在部分函数依赖
  3. 不能存在传递函数依赖

数据库事务

基本要素(ACID)
  • 原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有操作像没发生一样。
  • 一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏。比如A向B转账,不能A扣了钱,B却没收到。
  • 隔离性(Isolation):同一时间,只允许一个事务请求数据,不同的事务之间彼此没有干扰
  • 持久性(Durability):事务完成后,事务对数据库的所有更新操作将被保存到数据库中,不能回滚。
并发

引擎

  • MyISAM:MySQL官方引擎,支持全文索引,查询效率比较高,缺点是不支持事务,使用表级锁
  • InnoDB:5.5版本后成为默认储存引擎,支持ACID、支持外键、支持行级锁提高并发效率
  • ToKuDB:第三方开源引擎,写速度快,支持数据压缩,可以在线添加索引而不影响写操作。因为数据压缩的原因,不适合大量读取的场景

  • 表锁:开销小,加锁快,不会出现死锁;但锁的粒度大,容易发生锁冲突,并发访问效率低
  • 行级锁:开销大,加锁慢,可能会出现死锁。因为锁粒度小,发生冲突的概率低,并发访问效率高
  • 共享锁:读锁,MySQL通过lock in share mode显示使用共享锁
  • 排它锁:写锁,不能读写。对于UPDATE、DELETE、INSERT会自动给涉及的数据集加排它锁,或者使用select for update显示使用排它锁

索引

索引可以大幅度增加数据库查询性能,但是索引需要额外的空间存储;对于插入、更新、删除等操作,更新索引会增加额外的开销,因此索引适合读多写少的场景。

  • 唯一索引,索引列中的值必须唯一,允许为空。例如账户信息表中账户ID
  • 主键索引,不允许出现空值
  • 普通索引,与唯一索引不同,允许出现相同的值,例如学生成绩表,分数是允许重复的
  • 联合索引,对多个列字段按顺序共同组成一个索引。使用联合索引时需注意最左原则,就是where查询条件中的字段必须与索引字段从左到右进行匹配。
  • 全文索引,全文索引只能在CHAR、VACHAR、TEXT类型字段使用,底层使用倒排索引实现。对于大数据量的表,生成全文索引会非常耗时耗磁盘。

索引实现

  • B+树,适合用作>或<范围查询
  • R-Tree,用于处理多维数据,可以对地理数据进行空间索引
  • Hash,使用散列表对数据进行索引
  • FullText,记录关键字与对应文档关系的倒排索引

调优

慢查询

  • 通过MySQL命令行模式开启,执行"set global sloq_query_log=1",重启MySQL后无效
  • 修改my.cnf中的"slow_query_log=1",同时设置"slow_query_log_file=/tmp/mysql_slow.log"配置慢查询日志的存储目录,重启MySQL生效。

  • id 选择标识符,id越大优先级越高
  • select_type 查询类型
  • table 输出结果集的表
  • partitions 匹配的分区
  • type 表的连接类型
  • possible_keys 在查询时,可能使用的索引
  • key 实际使用的索引
  • ref 列与索引的比较
  • rows 大概估算的行数
  • filtered 按表条件过滤的百分比
  • Extra 执行情况的描述和说明

type字段的值

  • all 全表扫描
  • index 遍历索引
  • range 索引查找范围
  • index_subquery 在子查询中使用ref
  • unique_subquery 在子查询中使用eq_ref
  • ref_or_null 对null进行索引优化
  • fulltext 全文索引
  • ref 使用非唯一索引查找数据
  • eq_ref 在join查询中使用主键或唯一索引关联