(星号表示遇到的频率)
1、事务
1.1 事务的特性(****)
-
原子性
事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
-
一致性
事务开始之前和之后,数据库的完整性约束没有被破坏,数据库事务不能破坏关系数据的完整性以及逻辑的一致性。
-
隔离性
多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其他事务运行效果。在并发环境中,当不同事务同时操纵相同的数据时,每个事务都有各自的完整空间。
-
持久性
事务完成以后,该事务对数据所做的更改便会持久的保存在数据库之中。
1.2 隔离级别
1.2.1 并发引起的问题(***)
-
丢失修改
两个事务t1,t2读入统一数据并修改,t2的提交被t1的修改破坏了。
-
不可重复读
t1读取数据后,t2执行更新操作,t1无法再读取结果。(通过“读锁”和“写锁”解决不可重复读,读取数据的事务将会禁止写事务(允许读),但写的时候,禁止其他任何操作)。
-
脏读
t1修改了某个数据并写回磁盘,t2读取同一数据,但t1撤销了,此时t2与t1中的数据不一样。
-
幻读
两次查询操作中查到的数据不一致(在查询之间有另一事务的插入操作)。
1.2.2 事务的隔离级别(*****)
-
未提交读
最低的隔离级别。允许脏读,但不允许更新丢失,事务可以看到其他事务尚未提交的修改。
-
提交读
允许不可重复读,但不允许脏读取,可以通过“瞬间共享读锁”和“排他写锁”实现。读取数据的事务允许其他事务继续访问改行数据,但是未提交的写事务将会禁止其他事务访问。
-
可重复读
禁止不可重复读,但有时会出现幻读数据。可以通过“共享读锁”和“排他写锁“实现。读取数据的事务将会禁止写事务(允许读),写事务禁止其他任何事务。
-
可序列化
最高的隔离级别,要求事务序列化执行,事务只能一个接一个执行,并不能并发执行。必须通过一些机制,保证新插入的数据不会被刚执行查询操作的事务访问到。
事务的隔离级别越高,越能保证数据的完整性和一致性,但是对并发的的影响也越大。
2、常见的存储引擎及特性(***)
2.1 InnoDB(*****)
- InnoDB是事务型数据库的首选引擎,支持事务安全表(ACID),其它存储引擎都是非事务安全表,支持行锁定和外键,MySQL5.5以后默认使用InnoDB存储引擎。
- 特性
- 为MySQL提供了具有提交、回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎。
- InnoDB锁定在行级并且也在 SELECT语句中提供一个类似Oracle的非锁定读,这些功能增加了多用户部署和性能。
- 可以自由地将InnoDB类型的表和其他MySQL的表类型混合起来,甚至在同一个查询中也可以混合。
- 对于InnoDB表,自动增长列必须是索引。如果是组合索引,也必须是组合索引的第一列,但是对于MyISAM表,自动增长列可以是组合索引的其他列,这样插入记录后,自动增长列是按照组合索引到前面几列排序后递增的。
- MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引。
2.2 MyISAM
-
MyISAM基于ISAM存储引擎,并对其进行扩展。它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。MyISAM拥有较高的插入、查询速度,但不支持事务,不支持外键。
-
特性
- 被大文件系统和操作系统支持。
- 当把删除和更新及插入操作混合使用的时候,动态尺寸的行产生更少碎片。这要通过合并相邻被删除的块,若下一个块被删除,就扩展到下一块自动完成。
- NULL被允许在索引的列中,这个值占每个键的0~1个字节。
2.3 MEMORY
- MEMORY存储引擎将表中的数据存储到内存中,为查询和引用其他表数据提供快速访问。
- 特性
- MEMORY表的每个表可以有多达32个索引,每个索引16列,以及500字节的最大键长度。
- 可以在一个MEMORY表中有非唯一键值。
- MEMORY支持AUTO_INCREMENT列和对可包含NULL值的列的索引。
2.4 InnoDB和MyISAM的区别
1、MyISAM是非事务安全的,而InnoDB是事务安全的
2、MyISAM锁的粒度是表级的,而InnoDB支持行级锁
3、MyISAM支持全文类型索引,而InnoDB不支持全文索引
4、MyISAM相对简单,效率上要优于InnoDB,小型应用可以考虑使用MyISAM
5、MyISAM表保存成文件形式,跨平台使用更加方便
6、MyISAM管理非事务表,提供高速存储和检索以及全文搜索能力,如果在应用中执行大量select操作可选择
7、InnoDB用于事务处理,具有ACID事务支持等特性,如果在应用中执行大量insert和update操作,可选择。
3、查询语句(*****)
通常手撕数据库的多表查询,偶尔问一些关键字的使用顺序
-
查询(关键字)顺序:
select distinct <select_list> from <left_table> <join_type> join <right_table> on <join_condition> where <where_condition> group by <groupby_list> having <having_condition> order by <orderby_conditoin> limit <limit number>;
-
leetcode :力扣数据库题目 简单题基本过一遍,会上面的关键字的用法即可。
4、常见索引有哪些(*****)
4.1 聚集索引、非聚集索引(***)
-
聚集索引:数据行的物理顺序与列值(一般是主键的那一列)的逻辑顺序相同,一个表中只能拥有一个聚集索引。
聚集索引类似于电话簿(或者拼音字典),后者按姓氏排列数据。由于聚集索引规定数据在表中的物理存储顺序,因此一个表只能包含一个聚集索引。但该索引可以包含多个列(组合索引),就像电话簿按姓氏和名字进行组织一样。
-
非聚集索引:数据存储在一个地方,索引存储在另一个地方,索引带有指针指向数据的存储位置,一个表中可以拥有多个非聚集索引。
其实按照定义,除了聚集索引以外的索引都是非聚集索引,只是人们想细分一下非聚集索引,分成普通索引,唯一索引,全文索引。如果非要把非聚集索引类比成现实生活中的东西,那么非聚集索引就像新华字典的偏旁字典,他结构顺序与实际存放顺序不一定一致。
4.2 普通索引、主键索引、唯一索引、组合索引、全文索引(*****)
- 普通索引:最基本的索引,没有任何限制
- 唯一索引:与"普通索引"类似,不同的就是:索引列的值必须唯一,但允许有空值。
- 主键索引:它是一种特殊的唯一索引,不允许有空值。
- 组合索引:为了更多的提高mysql效率可建立组合索引,遵循”最左前缀“原则。
- 全文索引:仅可用于 MyISAM 表,针对较大的数据,生成全文索引很耗时好空间。
4.3 B+Tree索引、Hash索引(****)
-
B+Tree
是mysql使用最频繁的一个索引数据结构,数据结构以平衡树的形式来组织,因为是树型结构,所以更适合用来处理排序,范围查找等功能.相对hash索引,B+树在查找单条记录的速度虽然比不上hash索引,但是因为更适合排序等操作,所以他更受用户的欢迎.毕竟不可能只对数据库进行单条记录的操作.
-
Hash
hsah索引在mysql比较少用,他以把数据的索引以hash形式组织起来,因此当查找某一条记录的时候,速度非常快.当时因为是hash结构,每个键只对应一个值,而且是散列的方式分布.所以他并不支持范围查找和排序等功能.
4.4 索引底层实现原理(包含BTree和B+Tree的区别)(*****)
这里需要图片展示更直观一些(b树就是b-树),找了一个讲的不错的博客: B树和B+树
5、SQL优化有哪些方法(*****)
-
问题:为什么需要sql优化?怎么使用sql优化?
-
答:
-
为了提升查询效率,在sql优化中最重要的是避免全表扫描;(第一问)
-
适当的创建索引,考虑在 where 及 order by 涉及的列上建立索引(把所建的索引所用列名,用在where语句中,并尽量在条件的最右边(这里开始全是第二问,一般下面你记得几个简单的就可以啦)
-
尽量避免在 where 子句中对字段进行 null 值判断、使用!=或<>操作符、使用 or 来连接条件、对字段进行函数操作等
-
in 和 not in 也要慎用,否则可能会导致全表扫描
-
很多时候用 exists 代替 in 是一个好的选择
-
尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。
-
尽可能的使用 varchar 代替 char ,因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。
-
把条件最小的写在最右边,如果id=?写在最右边
-
尽量少写子查询,用join语句代替,少写in,like,or
-
更多的具体条目参考这篇写的不错的博客 这里查看
-
6、简述一下sql的编译过程(***)
大致过程:
- 客户端发送查询语句给服务器。
- 服务器首先检查缓存中是否存在该查询,若存在,返回缓存中存在的结果。若是不存在就进行下一步。
- 服务器进行SQl的解析、语法检测和预处理,再由优化器生成对应的执行计划。
- Mysql的执行器根据优化器生成的执行计划执行,调用存储引擎的接口进行查询。
- 服务器将查询的结果返回客户端。
具体的参考:sql语句执行过程