MySQL

1.NULL和“”的区别

        1.NULL代表的是一个不确定的值,就算是两个NULL也不一定相等,例如select null = null的结果为false

        2.""不占内存空间,长度为0,而null占空间

        3.NULL会影响聚合函数的结果

        4.查询NULL值时,必须使用is null和is not null,而不能使用!=等运算符,而""可以使用运算符

2.数据库表中Boolean类型表示

         TINYINT(1)类型表示,1代表true,0代表false

3.MySQL的基础架构

        1.连接器:身份认证和权限相关

        2.查询缓存:执行查询语句时,会先查询缓存(MySQL8.0版本后移除)

        3.分析器:如果没有命中缓存,SQL语句就会经过分析器,用于判断语句作用和语法是否正确

        4.优化器:按照MySQL认为最优的方案执行

        5.执行器:执行语句,然后从存储引擎中返回数据

        6.插件式存储引擎:主要负责数据的存储和读取

4.MySQL支持哪些存储引擎,默认使用哪个

        可以通过show engInes命令来查询所有存储引擎,默认使用innoDB,且只有InnoDB引擎时事务性引擎

5.MySQL的存储引擎架构

        MySQL的存储引擎采用的是插件式架构,支持多种存储引擎,是基于表而不是基于数据库

6.MyISAM和InnoDB的区别

        1.MySQL5.5之前使用的默认引擎为MyISAM,后改成InnoDB

        2.MyISAM只有表级锁,而InnoDB有表级锁还有行级锁,默认为行级锁

        3.MyISAM不支持事务,InnoDB支持事务

        4.MyISAM不支持外键,而InnoDB支持外键

        5.MyISAM不支持MVCC,而InnoDB支持

        6.MyISAM不支持数据库异常崩溃后安全恢复,InnoDB支持

        7.MyISAM性能不如InnoDB

7.MySQL索引

7.1 概念

        索引是一种用于快速查找和定位数据的数据结构

7.2 优缺点

        优点:使用索引可以大大加快数据的检索速度,减少IO次数,并且可以通过创建唯一索引来保证数据表每一行数据的唯一性

        缺点:创建和维护索引需要耗费时间,如果对有索引的数据进行增删改时也需要对索引进行修改,降低sql执行效率,并且创建索引需要物理内存空间

7.3 分类

7.3.1 底层存储方法分类

        聚簇索引:索引结构和数据一起存放

        非聚簇索引:索引结构和数据不一起存放

7.3.2 数据结构维度分类

        BTree索引:默认和最常见索引,只有叶子节点存储value

        哈希索引: 类似键值对方式,一次即可定位

        RTree索引:仅支持geometrt数据类型,优势在于范围查找但是效率低

        全文索引:对文本内容进行分词,进行搜索

7.3.3 应用维度分类

        主键索引:加速查询并列值唯一不能为NULL和表中只能有一个主键索引,设置的主键就是主键索引

        普通索引:仅加速查询

        唯一索引:加速查询+列值唯一   可以为NULL

        覆盖索引:一个索引包含所需要查询的字段的值

        联合索引:各列值组成一个索引,专门用于组合搜索,效率大于索引合并     

8.事务

8.1 概念

        逻辑上的一种操作,要么都执行,要么都不执行

8.2 特性

        原子性:事务是最小的执行单位,不可被划分

        一致性:事务执行前后数据保持一致,例如转账业务中,无论事务是否成功,转账者和收款人的总额应该是不变的

        持久性:事务执行后,对数据库中的数据的改变是永久的,即使是数据库发生故障也不会改变

        隔离性:在并发访问数据库下,一个用户的事务不会被其他用户的事务影响,并发事务对数据库的操作互补影响

        只有保证了原子性,持久性和隔离性才能保证一致性

8.3 并发事务带来的问题

8.3.1 脏读

      事务A对一个数据进行修改后,但是并没有提交事务,事务B读取该数据,读取到的时修改后的数据,但是后面事务A进行回滚,该数据又没有修改,而事务B却读到了修改后的数据,这就是脏读

8.3.2 丢失修改

        事务A读取到数据X,事务B也读取到数据X,这两个事务同时对数据X进行修改,最后导致数据结果只修改了一次,导致其中一个事务的修改丢失,这就是丢失修改

8.3.3 幻读

        事务A读取了某个条件的数据,共有n行,然后事务B根据该条件插入或删除几行数据,然后事务A在结束前又读取了该条件的数据,发现两次读取到的数据多了或者少了。这就是幻读

8.3.4 不可重复读

        事务A多次读取数据X,但在多次读取中事务B对数据X进行了修改,导致事务A前后读取到的数据不一致,这就是不可重复度

8.4 并发事务的控制方式

8.4.1 锁

        锁 控制方式下会通过锁来显式控制共享资源而不是通过调度手段,MySQL 中主要是通过读写锁 来实现并发控制。

  • 共享锁(S 锁):又称读锁,事务在读取记录的时候获取共享锁,允许多个事务同时获取(锁兼容)。
  • 排他锁(X 锁):又称写锁/独占锁,事务在修改记录的时候获取排他锁,不允许多个事务同时获取。如果一个记录已经被加了排他锁,那其他事务不能再对这条记录加任何类型的锁(锁不兼容)。

        读写锁可以做到读读并行,但是无法做到写读、写写并行。另外,根据根据锁粒度的不同,又被分为 表级锁(table-level locking) 和 行级锁(row-level locking) 。InnoDB 不光支持表级锁,还支持行级锁,默认为行级锁。行级锁的粒度更小,仅对相关的记录上锁即可(对一行或者多行记录加锁),所以对于并发写入操作来说, InnoDB 的性能更高。不论是表级锁还是行级锁,都存在共享锁(Share Lock,S 锁)和排他锁(Exclusive Lock,X 锁)这两类。

8.4.2 MVCC

        MVCC 是多版本并发控制方法,即对一份数据会存储多个版本,通过事务的可见性来保证事务能看到自己应该看到的版本。通常会有一个全局的版本分配器来为每一行数据设置版本号,版本号是唯一的。

9. MySQL的事务隔离级别

9.1 读未提交

        最低的隔离级别,运行读取尚未提交的数据变更,可能会导致脏读,幻读或不可重复读

9.2 读已提交

        运行读取并发事务已经提交的数据,可以阻止脏读,但是幻读和不可重复读仍然可能发生

9.3 可重复读

        对同一字段的多次读取结果都是一致的,除非数据时本身事务修改,可以阻止脏读和幻读,但是不能阻止不可重复读(InnoDB默认的事务隔离级别)

9.4 可串行化

        最高的事务隔离级别,完全服从ACID的隔离级别,所有的事务依次执行,这个事务之间就完全不可能产生干扰,可以防止所有并发事务产生的问题

        隔离级别        脏读        不可重复读        幻读
        读未提交        √        √        √
        读已提交        ×        √        √
        可重复读        ×        ×        √
        串行化        ×        ×        ×

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值