mysql

哔哩哔哩了视频连接

 

1.连接查询-笛卡尔乘积

  笛卡尔乘(ab表相乘)积(得到的结果)现象:如果现在有两张表 A表有N条数据,B表有M条数据;在没有使用任何有效的条件的情况下,使用 语句 select * from a,b 得到的结果是 N*M条数据的一张表。

  查询语法92年定了一个规则,99年定了一个规则;

   内连接 :A,B两张表都为主表 92年语法是先乘积产生笛卡尔积,然后从笛卡尔乘积结果中筛选符合条件的记录;99年语法 inner join 是 从A,B表中 通过连接条件 拼接成一张新的表,取出两张表中能通过连接条件关联到一起的记录,如A表 1-10 a-c,B表的记录1-10 E-                                F,取出来的数据是 1-10;

  99年外连接: left join  是把left join左边的表作为主表,根据连接条件,拿左表的记录去右表 找到符合条件的右表数据,放到查询结果的新表中,匹配不到 左表添加空值拼接。

        select 条件 from A表 left jion B表

           on 连接条件

          where 筛选条件

          group by 分组条件

            (having 分组后的筛选条件)

          order by 排序条件

         使用左连接的时候,如果连接条件都唯一,不会产生笛卡尔乘积,如果非主表不唯一的情况 ,这个不唯一的记录,会产生局部的笛卡尔乘积,主表不唯一不会产生笛卡尔乘积

          studnet 表  name studnetid;  a,1 b 2,c 3,d 3

          teacher表  studentid  teacher; 1,t1,2.t2 3,t3 4,t4

          结论:,如果非主表不唯一的情况 ,这个不唯一的记录,会产生局部的笛卡尔乘积,主表不唯一不会产生笛卡尔乘积

2.事务的隔离级别

   事务是计算机术语,含义是 一条sql语句或者多条sql语句 在执行的时候,将他们作为一个整体,期望的结果呢  sql语句全部执行(且成功) 或者是 都没执行;多条sql语句中这些sql之间是依赖关系,如果有一条sql语句没有执行或者执行失败,这个整体能都进行回滚,数据库中的数据回到初始未执行这些sql的状态,牵一动全身; 

  事务的特性:

        原子性:事务是个整体不可以分隔,原子的定义就是不可分隔的最小单元(定义之前是,现在原子是可以分隔了 )。

        一致性:事务执行前后,数据库中的数据是完整的。数据库中的数据关系从一种完整性(一致)状态 变成了另外一种完整性(一致)状态

        隔离性:多个事务可以同时执行,他们之间不相互影响。

        持久性:事务一旦执行成功,会永久性改变数据库中的数据。

        

  navicat 中执行事务:

      mysql 默认的情况开启自动提交功能,默认每一条语句就是一个事务,所以无法把多条sql作为一个整体 进行事务执行;

          myql有个把单个sql作为一个事务进行提交的功能。

      show VARIABLES like 'autocommit'  查看自动提交配置
      set autocommit = 0; 关闭自动提交功能

       sql1

       sql2 ,,,

      结束事务

      commit(提交事务)/rollback(回滚事务)

       

  事务并发执行产生的问题: 多事务并发执行 并且访问相同数据库中相同的数据     

              脏读:A事务读取了B事务更新了但是未提交的字段数据,如果B事务回滚了,那么A读取的这个字段数据就是临时且无效的数据。

              不可重复读: A事务读取了字段数据两次,这两次正好是B事务更新这个字段数据前后。所以A读取的这个字段数据前后两次不一致。

              幻读:A事务读取表中的数据,B事务那对表行数进行了删除或者增加,导致A事务再次读取的行数的时候发现行数多了或者少了。

  默认隔离级别

      事务的隔离性 是解决事务并发产生问题的方法;

      隔离级别的意思是 一个事务和其他事务的隔离程度(达到的效果),这个隔离程度越高,数据的一致性越高,然而并发性越弱。

  事务的隔离级别:

      1.读未提交:事务A开启,事务B可以读取事务A未提交的数据,未提交意味着这个字段数据可以回滚,那么会产生,脏读,不可重复读,幻读

      2.读已提交:事务A开启,事务B只能读取事务A已经提交的数据,数据提交,意味着这个字段数据已经永久改变,A事务数据不会回滚,所有不存在脏读;不可重复读会存在,事务B第一次读取数据是事务A未提交之前的字段数据,第二次读取字段数据是事务A提交后的数据;同理 幻读的存在是 A事务对表中的行进行的增加;Oracle 默认的隔离级别就是读已提交

      3.可重复读:一个事务中多次读取字段数据相同为可重复读,实现的效果,事务A开启,事务B开启,事务A读取字段数据两次,第一次B事务中操作这个字段尚未提交或者为操作这个字段, 第二次是B事务已经提交成功了(既然事务B能提交成功说明没有加锁),事务A读取的这个字段两次数据值相同;但是不支持幻读,事务A读取两次之间,如果事务B对表中中行进行了插入操作,那么事务A读取的行是不一样的,产生了幻读;Mysql的默认隔离级别就是可重复读

      4.序列化:脏读,不可重复读,幻读都能解决;类似于线程同步,A事务执行期间,禁止B事务无法执行sql语句;解决了所有并发问题但是性能差。

       查看数据库的隔离级别:select @@transaction_isolation;

  事务传播性

 

3.p188 sql性能

 

4.p192索引

 

5.p241 主从复制

 

6.p331sql预热

 

7.p345 主从复制 分库分表

 

8. MySql字段拼接  concat

SELECT
  p.code_ename value,
  concat(p.code_cname,"(",p.code_ename,")") label
FROM
  prpd_code p
WHERE
p.code_type = #{codeType}


问题:
1.mysql 和oracle 默认的隔离级别是什么哪个更高
  

  MySQL 和 Oracle 默认的隔离级别分别是 Repeatable read 和 Read committed 12。其中,MySQL 支持上面四种隔离级别,而 Oracle 只支持 Serializable(串行化)级别和 Read committed(读已提交)这两种级别,其中默认的为 Read committed(读已提交)级别 2

因此,MySQL 的默认隔离级别更高。

 

2.什么是 可重复读 如何解决不能重复读的问题,还有什么是串行化,可重复读是不是锁行,串行化是不是锁表了

  可重复读是 MySQL 的一个事务隔离级别,它确保同一个事务在并发读取数据时,会看到同样的数据行。在事务开启时会创建一致性视图,在事务进行期间,数据读取逻辑都依赖于视图。因此,即使其他事务对数据进行了修改,当前事务也不会看到这些修改,从而保证了可重复读的特性 1

如果不能重复读,则可能会出现幻读的问题。幻读是指在同一个事务中,两次执行相同的查询语句,第二次查询返回了第一次查询中没有的行。为了解决这个问题,MySQL 提供了一种名为 间隙锁 的机制 2

串行化是 MySQL 的另一个事务隔离级别,它是最高的隔离级别。在该隔离级别下,所有的事务都是串行执行的。这意味着,在该隔离级别下,所有的事务都必须等待其他事务执行完成后才能执行 3

可重复读不是锁行,而是使用了一致性视图来实现可重复读特性。串行化也不是锁表,而是将所有事务串行执行来保证隔离性 1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 
 
posted @ 2021-12-08 09:22  BBS_自律  阅读(31)  评论(0编辑  收藏  举报