事务的四大特征

  • 原子性
    • 事务是最小的执行单位不容分割要么全部成功要么全部失败
  • 一致性
    • 事务操作前后事务的总量保持不变
  • 隔离性
    • 并发访问数据库时,各个事务相互隔离互不干扰
  • 持久性
    • 事务提交后对数据库操作作用是持久的即使数据库发生故障也不例外

并发事务带来的存在那些问题?

  • 脏读
    • 当一个事务正在访问数据库进行操作修改数据,数据还未提交,另一个事务访问到了还没有提交的数据这就是脏读;
  • 不可重复度
    • 指在一个事务中进行两次查询操作得到的数据不一致;在两次查询中间其他事务对数据进行了修改;
  • 幻读
    • 指在一个事务读取时另一个事务进行数据添加,这时就会发现读取到原本不存在的数据;

事务隔离级别?

  • READ-UNCOMMITTED(读取未提交)
    • 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读
  • READ-COMMITTED(读取已提交)
    • 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生
  • REPEATABLE-READ(可重复读)
    • 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生
  • SERIALIZABLE(可串行化)
    • 最高的隔离级别,完全服从 ACID 的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读

mysqal中内连接外连接有啥区别?

  • 内连接
    • 连接表中都需要满足连接条件才会被查询出来
  • 外连接
    • 外连接分为左连接和右连接;左连接左表数据会全部查询出来右表中满足连接查询条件的才会被查询出来

SQL执行流程循序

  • FROM
    • 对于from关键字两边的表进行连接形成一个虚拟表V1
  • ON
    • 对from的结果进行ON过滤形成虚拟表V2
  • join
    • 添加外部行如果是left join 就将左表添加进来反之则添加右表生产虚拟表V3
  • Where
    • 进行过滤生产虚拟表V4
  • Group by
    • 分组
  • Having
    • 过滤
  • Select
    • 查询
  • DisTinct
    • 去重
  • Order by
    • 排序

主键使用自增 ID和 UUID区别?

  • 自增id空间连续用完了再去申请,UUID插入时具有不确定性会存在很多内存碎片;
  • 自增id主键索引能更好的支持查询

聚簇索引和非聚簇索引的区别

  • 聚簇索引
    • 将数据存储与索引放到一块,并且是按照一定的循序组织的,找到索引也就找到了数据,数据的物理存放顺序与索引是一致;
  • 非聚集索引
    • 叶子节点不存数据,存储的是数据的地址,也就是说需要根据索引查找到数据行的位置再去读取磁盘查找数据

mysql的存储引擎

  • 1.5之前默认得存储引擎时myisam
    • 只支持表级锁
    • 不支持外键
    • 不支持事务
    • 一个MYSIAM表有三个文件:索引文件、表结构文件、数据文件
    • 采用得非聚簇索引,索引文件的数据域存储指向文件的指针,辅助索引与主索引基本一致,但是辅助索引不需要保证
  • 1.5之后默认得innoDB
    • 支持表级锁和行级锁
    • 支持外键
    • 支持ACID事务,支持事务的四种隔离级别
    • 不存储行数
    • z主键采用的聚集索引,叶子节点的(索引的数据域存储数据文件本身),辅助的索引域存储主键的值,最好使用自增主键,防止插入数据时,为维护b+tree索引结构时文件大调整

查看sql执行计划

  • explain
  • 主要就是type;type中效率依次到好 system>const>eq_ref>ref>range>index>all
  • eq_ref多表连接查询得时候被驱动得表连接列上包含主键
  • ref走了辅助索引
  • range范围查询
  • index全索引查询
  • all全表查询

mysql索引得数据结构了解吗?

  • mysql索引有一个优化得过程得,从开始得hash表,数,红黑树,到后面得btree,b+tree;hash表是最常见得等值查询快,不支持范围查询,树呢极端情况下还是会演变成链表,红黑树呢在此基础上进行了优化,数得深度差大于1的时候进行左旋或右旋防止演变成链表,但是在数据量大得时候这个数得深度还是很深影响效率,btree呢引入了磁盘块得概率可以通过设置默认16kb,也就是一个节点就是一个块,btree 和b+btree就是采用得这种数据结构,区别是btree中所有得节点都存储数据、指针,b+tree呢只有叶子节点存data,这样就保住数得深度不至于太深

mysql索引优化

  • 索引列不要参与运算
  • 不用!=
  • 不用 is null
  • 索引列类型自动转换
  • 模糊查询 尽量使用覆盖所有
  • 少用or
  • 遵循最左前缀法则
    • 多列索引将查询最频繁的数据放到where的最左边
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐