在数据库中查询语句速度很慢,如何优化?
① 建立索引;
② 减少表之间的关联;
③ 优化sql语句,尽量让sql很快定位数据,不要让sql做全表查询,应该走索引,把数据量大的排在前面;
④ 简化查询字段,没用的字段不要;
⑤ 尽量用PreparedStatement来查询,不要用Statement。
MySQL 语句执行的步骤?
主要包含如下执行步骤:
- 客户端请求: 连接器(验证用户身份,给予权限);
- 查询缓存:存在缓存则直接返回,不存在则执行后续操作;
- 分析器:对 SQL 进行词法分析和语法分析操作;
- 优化器:主要对执行的 SQL 优化选择最优的执行方案方法;
- 执行器:执行时会先看用户是否有执行权限,有才去使用这个引擎提供的接口-> 去引擎层获取数据返回(如果开启查询缓存则会缓存查询结果)。
数据库三范式?
第一范式(1NF):属性不可分割,即每个属性都是不可分割的原子项;
第二范式(2NF):满足第一范式,且不存在部分依赖,即非主属性必须完全依赖于主属性;
第三范式(3NF):满足第二范式,且不存在传递依赖,即非主属性不能与非主属性之间有依赖关系,非主属性必须直接依赖于主属性,不能间接依赖主属性。
简单来说:
第一范式:列表字段不可分;
第二范式:有主键且非主键依赖主键;
第三范式:非主键字段不能相互依赖。
什么时候要创建索引?
(1)表经常进行 SELECT 操作;
(2)表很大(记录超多),记录内容分布范围很广;
(3)列名经常在 WHERE 子句或连接条件中出现。
什么时候不要创建索引?
(1)表经常进行 INSERT/UPDATE/DELETE 操作;
(2)表很小(记录超少);
(3)列名不经常作为连接条件或出现在 WHERE 子句中。
常用的索引有哪些类型?
- 唯一索引:唯一索引不允许两行具有相同的索引值;
- 主键索引:为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。主键索引要求主键中的每个值是唯一的,并且不能为空;
- 聚集索引(Clustered):表中各行的物理顺序与键值的逻辑(索引)顺序相同,每个表只能有一个;
- 非聚集索引(Non-clustered):非聚集索引指定表的逻辑顺序。数据存储在一个位置,索引存储在另一个位置,索引中包含指向数据存储位置的指针,可以有多个,小于249个。
binlog是什么?有什么作用?
1、数据恢复
只要有数据库在某个时刻的备份以及此时后的所有binlog,就可以恢复数据库的数据。
在我们的日常工作中,我们的DBA学生经常可以帮助我们将数据库的数据恢复到任何一秒。
2、主从复制
为了提高MySQL的效率,经常做读写分离,即一主多从。
一个主库(写库),多个从库(读库)。
此时,从库可以监控主库的binlog日志,同步写库的所有更改操作。
为什么需要 redo log?
mysql 为了提升性能不会把每次的修改都实时同步到磁盘,而是会先存到Boffer Pool(缓冲池)里头,把这个当作缓存来用,然后使用后台线程去做缓冲池和磁盘之间的同步。
那么问题来了,如果还没来的同步的时候宕机或断电了怎么办?还没来得及执行上面图中红色的操作,这样会导致丢部分已提交事务的修改信息。
所以引入了redo log来记录已成功提交事务的修改信息,并且会把redo log持久化到磁盘,系统重启之后在读取redo log恢复最新数据。
总结:redo log是用来恢复数据的 用于保障,已提交事务的持久化特性。
MySQL 的 redo log 和 binlog 区别?
详细的区别如下图所示:
事务四大特性?
事务应该具有4个属性:原子性、一致性、隔离性、持久性,这四个属性通常称为ACID特性。
- 原子性:事务作为一个整体被执行,包含在其中的对数据库的操作要么全部都执行,要么都不执行;
- 一致性:指在事务开始之前和事务结束以后,数据不会被破坏,假如A账户给B账户转10块钱,不管成功与否,A和B的总金额是不变的;
- 隔离性:多个事务并发访问时,事务之间是相互隔离的,一个事务不应该被其他事务干扰,多个并发事务之间要相互隔离;
- 持久性:表示事务完成提交后,该事务对数据库所作的操作更改,将持久地保存在数据库之中。
MySQL事务隔离级别有哪些?
MySQL 事务隔离级别总共有以下 4 种:
- READ UNCOMMITTED:读未提交;
- READ COMMITTED:读已提交;
- REPEATABLE READ:可重复读;
- SERIALIZABLE:序列化。
MyISAM 和 InnoDB 实现 B 树索引方式的区别是什么?
InnoDB 存储引擎:B+ 树索引的叶子节点保存数据本身,其数据文件本身就是索引文件;
MyISAM 存储引擎:B+ 树索引的叶子节点保存数据的物理地址,叶节点的 data 域存放的是数据记录的地址,索引文件和数据文件是分离的。
MySQL的表有哪些?并分别说明它们?
有四种不同类型的联接:
- 内部联接:返回两个表中具有匹配值的记录;
- 左联接:返回左表中的所有记录以及右表中的匹配记录;
- 右连接:从右表返回所有记录,并从左表返回匹配的记录;
- 完全连接:当左表或右表中存在匹配项时,返回所有记录。
B树和B+树的区别?
B树与B+树的区别有两个:
1)B树的非叶子节点是存储数据的,而B+树的非叶子节点只存储索引信息;
2)B+树的非最右侧的叶子节点向右会指向右侧的叶子节点,形成一个有序的连表.
在查找数据的时候,B树需要根据数据是比较查找查询次数比较多,由于B+树存储的是数据的索引,所以只有一次IO就可以查找到数据,而且B+树非叶子节点只存储索引,所以能存储更多的索引,使树的高度降低。
B+树索引和哈希索引的区别?
B+树是一个平衡的多叉树,从根节点到每个叶子节点的高度差值不超过1,而且同层级的节点间有指针相互链接,是有序的,如下图:
哈希索引就是采用一定的哈希算法,把键值换算成新的哈希值,检索时不需要类似B+树那样从根节点到叶子节点逐级查找,只需一次哈希算法即可,是无序的,如下图所示:
INNER JOIN 和 LEFT JOIN 有什么区别?
INNER JOIN用于包含两个表中符合ON条件的组合行,最终结果不包括与ON条件不匹配的行。
LEFT JOIN用于保留第一个表中的所有行,无论第二个表中是否存在与ON条件匹配的行。
什么是聚集索引和非聚集索引?
聚集索引:聚集索引是索引结构和数据一起存放的索引,类似于字典的正文,当我们根据拼音直接就能找到那个字。
非聚集索引:非聚集索引是索引结构和数据分开存放的索引,类似于根据偏旁部首找字,首先找到该字所在的地址,再根据地址找到这个字的信息。
mysql都有什么锁?
基于锁的属性分类:共享锁(读锁)、排他锁(写锁)。
基于锁的粒度分类:行级锁((innodb )、表级锁( innodb、myisam)、页级锁( innodb引擎)、记录锁、间隙锁、临键锁。
基于锁的状态分类:意向共享锁、意向排它锁(一般不用)。
MySQL存储引擎InnoDB、MyISAM的区别?
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》