mysql

一个关系型数据库

  • 储存部分
    • 类似一个文件系统,将数据存储到设备当中
  • 程序实例
    • 储存管理
    • 缓存机制
      • mysql 自带的缓存机制
    • sql解析
    • 日志管理
      • bin-log日志
        • 主要用于记录可能引起数据库内容更改的SQL语句或数据行记录
        • 主从同步 从库同步主库的bin-log 日志 实现主从同步
      • 错误日志
      • 查询日志
      • 慢查询日志
        • 可以在慢查询日志中 定位慢查询 对sql语句进行优化
      • 中继日志
    • 权限划分
    • 容灾机制
    • 索引管理
      • 索引用于快速找出在某个列中有一特定值的行
      • 索引类型
        • 主键索引
          • primary key 效率最高的索引
        • 唯一索引
          • unique key 不为空的情况下效率最高 
        • 普通索引
          • index 对数据没有要求,文件很大,效率比较低
        • 联合索引
          • 遵循最左原则
            • 左前索引主要指的是在复合索引中,给两个或多个字段建立了复合索引后,在 sql
            • 语句后的条件中,只有复合索引前面的字段在条件的前面时,该索引才起作用,比如创
            • 建了个复合索引 index (a,b),在使用 where 或者 orderby 条件时,如果只有条件 b
            • 的,该索引不会生效,必须有条件 a 且必须要在条件 b 的前面该索引才会生效。
        • 全文索引
          • fulltext 对整个文章内部进行关键字索引 ----mysql5.5 以后 InnoDB 支持全文索引)
      • 什么样的信息能成为索引
        • 主键
        • 普通键
        • 唯一键
      • 需要注意的点
        • ①为了避免建议索引而造成索引文件过大,有时候我们会使用复合索引,这时候要遵循最左原则。
        • ②like 查询,前%不会用到索引  
        • ③如果条件中有 or,则要求 or 的索引字段都必须有索引,否则不能用到索引。
        •  ④如果列类型是字符串,一定要在条件中将数据使用引号引用起来,否则不使用索引。 
        • ⑤优化 group by 语句  
        • ⑥尽量避免模糊匹配,这样会导致全盘扫描 
      • 索引的数据结构
        • B+tree
          • 特点
            • 非叶子节点仅用来索引,数据都保存在叶子节点中
            • 所有叶子节点均有一个链指针指向下一个叶子节点
            • 磁盘读写代价低 ---- 不放数据信息 只存放索引信息 一次性加载到内存里数据多 减少磁盘IO
            • 查询更加稳定
            • 有利于对数据库扫描 B+tree 做范围查询
          • 时间复杂度
            • O(logn)
        • 哈希
          • 时间复杂度
            • O(1)
          • 特点
            • 仅仅满足 "in" "=" 不能做范围查询
            • 无法被用来避免数据的排序操作
            • 不能利用部门索引键查询
        • 密集索引和稀疏索引
          • 密集索引
            • 定义:叶子节点保存的不只是键值,还保存了位于同一行记录里的其他列的信息,由于密集索引决定了表的物理排列顺序,一个表只有一个物理排列顺序,所以一个表只能创建一个密集索引
            • mysam引擎 不管是主键索引 唯一索引 还是普通索引都是稀疏索引
          • 稀疏索引
            • 叶子节点仅保存了键位信息以及该行数据的地址,有的稀疏索引只保存了键位信息机器主键
            • innodb 有且只有一个密集索引 规则如下:
              • 若主键被定义 则主键作为密集索引
              • 若主键没有定义 该表的第一个唯一非空索引则为密集索引
              • 若不满足以上条件 会生成一个隐藏主键 来作为密集索引
          • 区别
            • 密集索引文件中的每个搜索码值都对应一个索引值
            • 稀疏索引文件索引码的某些值建立索引项 
        • 索引是建的越多越好么
          • 数据量小的表不需要建立索引 建立会增加额外的开销
          • 数据变更需要维护索引 更多的索引需要的维护成本
          • 更多的索引需要更多的空间
    • 锁管理
      • 乐观锁
        • 版本控制
        • 条件限制
      • 悲观锁
        • 读锁 -- 共享锁
        • 写锁 -- 排它锁
      • 死锁
        • 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.
        • 关键: 两个(或以上)的session加速顺序不一致(解决方法:让不同的session加锁有次序)
        • innoDB 发生 innoDB一般会会自动检测 死锁 使一个事务释放锁并回退,使另一个事务获得锁
      • 表锁
        • 开销小 加锁快 不会出现死锁 锁定粒度大 (锁粒度就是锁级别) 发生锁冲突的概率最高 并发度低
      • 行锁
        • 开销大 加锁慢 会出现死锁 锁定粒度小 发生锁冲突的概率 低 并发度高
      • 页面锁
        • 开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般
  • mysql的隔离级别
    • 读已提交 -- Read committed
    • 读未提交 -- Read uncommitted
    • 可重复读 -- Repeatable read
    • 可序列化 -- Serializable
      • 脏读 -- 事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据
      • 幻读 -- 系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。
      • 不可重复读 --事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。
  • 事物
    • 特性
      • 原子性
        • 事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。
      • 一致性
        • 事务开始前和结束后,数据库的完整性约束没有被破坏 。
      • 持久性
        • 事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。
      • 隔离性
        • 同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。
  • 三范式
    • 一、原子性 -- 数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。
    • 二、依赖性 -- 要求数据库表中的每个实例或行必须可以被惟一的区分。
    • 三、唯一性 -- 要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。
  • 储存引擎
    • MyISAM
      • 不支持事务
      • 不支持外键
      • 支持表锁
      • 支持全文检索
      • 数据储存方式 三个文件 结构、索引、数据,
      • 添加 查询 性能高于innodb
    • InnoDB
      • 支持事务
      • 支持外键
      • 支持行锁
      • 在 MySQL5.6 版本之后才支持全文检索 
      • 数据储存方式 两个文件 结构、 索引和数据放在一起
      • 批量删除性能较高
    • MEMORY等
posted @ 2019-06-10 14:59  九--夜  阅读(161)  评论(0编辑  收藏  举报