知识图谱
三范式
- 属性不可切割
- 不能存在
部分函数依赖 - 不能存在传递函数依赖
数据库事务
基本要素(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查询中使用主键或唯一索引关联