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的隔离级别,所有的事务依次执行,这个事务之间就完全不可能产生干扰,可以防止所有并发事务产生的问题
隔离级别 | 脏读 | 不可重复读 | 幻读 |
读未提交 | √ | √ | √ |
读已提交 | × | √ | √ |
可重复读 | × | × | √ |
串行化 | × | × | × |