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 主从复制 分库分表

原文地址:https://www.cnblogs.com/nextgg/p/15659906.html