数据库
慢速SQL优化
- WHERE 子句中:where 表之间的连接必须写在其他 Where 条件之前,那些
可以过滤掉最大数量记录的条件必须写在 Where 子句的末尾.HAVING 最后。 - 用 EXISTS 替代 IN、用 NOT EXISTS 替代 NOT IN。
- 避免在索引列上使用计算
- 避免在索引列上使用 IS NULL 和 IS NOT NULL
- 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by
涉及的列上建立索引。 - 应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使
用索引而进行全表扫描 - 应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用
索引而进行全表扫描
JDBC
JDBC的使用步骤?
- 注册驱动(有些新版本驱动会自动注册)
- 创建连接
- 创建Statement对象
- 执行SQL
- 处理SQL结果
- 关闭连接
在JDBC 编程中处理事务的步骤?
- 设置自动提交为false
- 执行事务处理SQL
- 如果没有异常,就提交事务
- 如果有异常,就回退事务
- 在finally中关闭连接
事务
什么是事务?
保证在一个事务中多次操作要么全都成功,要么全都失败.
事务可能发生问题?
- 脏读:一个事务读到了另一个事务未提交的数据.
- 不可重复读:一个事务读到了另一个事务已经提交(update)的数据。引发另一个事务,在事务中的多次查询结果不一致。
- 虚读 /幻读:一个事务读到了另一个事务已经提交(insert)的数据。导致另一个事务,在事务中多次查询的结果不一致。
隔离级别有哪些
为了达到事务的四大特性,数据库定义了4种不同的事务隔离级别,由低到高依 次为Read uncommitted、Read committed、Repeatable read、 Serializable,这四个级别可以逐个解决脏读、不可重复读、幻读这几类问题。
- READ-UNCOMMITTED(读取未提交): 最低的隔离级别,允许读取尚 未提交的数据变更,可能会导致脏读、幻读或不可重复读。
- READ-COMMITTED(读取已提交): 允许读取并发事务已经提交的数 据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。
- REPEATABLE-READ(可重复读): 对同一字段的多次读取结果都是一致 的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读 仍有可能发生。
- SERIALIZABLE(可串行化): 最高的隔离级别,完全服从ACID的隔离级 别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该 级别可以防止脏读、不可重复读以及幻读。
这里需要注意的是:Mysql 默认采用的 REPEATABLE_READ隔离级别 Oracle 默认采用的 READ_COMMITTED隔离级别 事务隔离机制的实现基于锁机制和并发调度。
其中并发调度使用的是MVVC(多 版本并发控制),通过保存修改的旧版本信息来支持并发一致性读和回滚等特 性。因为隔离级别越低,事务请求的锁越少,所以大部分数据库系统的隔离级别都是 - READ-COMMITTED(读取提交内容):,但是你要知道的是InnoDB 存储引擎默 认使用 REPEATABLE-READ(可重读)并不会有任何性能损失。 InnoDB 存储引擎在 分布式事务 的情况下一般会用到SERIALIZABLE(可串行 化)隔离级别。
事务的四大特性是什么
- 原子性(Atomicity)原子性是指事务是一个不可分割的工作单位,事务
中的操作要么都发生,要么都不发生。 - 一致性(Consistency)事务前后数据的完整性必须保持一致。
- 隔离性(Isolation)事务的隔离性是指多个用户并发访问数据库时,一个用户的事务不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离。
- 持久性(Durability)持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。
分库分表分片的策略有哪些?
数据切分(Sharding),简单的来说,就是通过某种特定的条件,将存放在同一
个数据库中的数据拆分存放到多个数据库(主机)中,从而达到分散单台机器负
载的情况,即分库分表。根据数据切分规则的不同,主要有两种模式,
- 垂直切分(纵向切分),是对不同的表(或者Schema)进行切分,存储到不同的数据库(主机)之上。
- 水平切分(横向切分),是对同一个表中的数据进行切分,存储到不同的数
据库(主机)之上。规则是根据表中数据的逻辑关系,按照某种条件拆分。
索引
- 索引技术原理
MySQL索引为什么这么快
为什么使用B+树,B+树的磁盘IO次数为多少
- 数据库在磁盘上存储数据,而磁盘IO性能相对较慢,提高数据检索性能到关键就是减少IO次数;
B+树从根节点到叶子节点层级只有3层,每次IO可以读取一个节点到内存中,然后使用2分查找定位,使用B+树检索数据每次只需要3次IO;
由于B+树索引IO次数非常少,是数据库广泛采用到索引技术。
主键索引和普通索引的区别
- 主键索引:是一种特殊的唯一索引,不允许有空值。
- 普通索引:MySQL 中基本索引类型,没有什么限制,允许在定义索引的列中插入重复值 和空值,纯粹为了查询数据更快一点。
索引失效情况有哪些?
- like 以%开头索引无效,当 like 以&结尾,索引有效。
- or 语句前后没有同事使用索引,当且仅当 or 语句查询条件的前后列均为索引时,索引生 效。
- 组合索引,使用的不是第一列索引时候,索引失效,即最左匹配规则。
- 数据类型出现隐式转换,如 varchar 不加单引号的时候可能会自动转换为 int类型,这个时候索引失效。
- 在索引列上使用 IS NULL 或者 IS NOT NULL 时候,索引失效,因为索引是不索引空值的。
- 在索引字段上使用,NOT、 <>、!= 、时候是不会使用索引的,对于这样的处理只会进行全表扫描。
- 对索引字段进行计算操作,函数操作时不会使用索引。
- 当全表扫描速度比索引速度快的时候不会使用索引。
如何判定SQL语句命中了索引
- 分析 SQL 执行计划(explain extended),思考可能的优化点,是否命中索引等。
左外连接查询和右外关联查询的区别?
-
外连接分为三种,分别是是左外连接(LEFT OUTER J0IN 或 LEFT JOIN 右外连接(RIGHT OUTER JOIN 或 RIC GHT JOIN、全外连接(FULL OUTER JOIN 或FULLJOIN)。
-
左外连接:又称为左连接,这种连接方式会显示左表不符合条件的数据行,右边不符合条件的数据 行直接显示 NULL。
-
右外连接:也被称为右连接,他与左连接相对,这种连接方式会显示右表不符合条件的数据行,左 表不符合条件的数据行直接显示 NULL。
-
学生、课程、成绩 表格关系查询问题
数据库建表的范式是什么?
- 第一范式:每个列都不可以再拆分。
- 第二范式:在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分。
- 第三范式:在第二范式的基础上,非主键列只依赖于主键,不依赖于其他非主
键。 - 在设计数据库结构的时候,要尽量遵守三范式,如果不遵守,必须有足够的理由。比如性能。事实上我们经常会为了性能而妥协数据库的设计。
安装过MySQL吗?MySQL里如何
实现远程连接?
授权法
- 使用GRANT命令,添加新的用户,授予远程访问权限
改表法
- 在localhost登入mysql后,更改 “mysql” 数据库里的 “user” 表里的 “host"项,将"localhost"改称”%"
- MySQL里的八小时末处理的机制了解吗?
使用过哪些数据连接池?数据库连接池有什么用?
- Druid数据库
- HikariCP
- 是维护的数据库连接的缓存,以便在将来需要对数据库发出请求时可以重用连接。 连接池用于提高在数据库上执行命令的性能。 保护数据库连接总数,避免连接过载。
数据库中常见的聚合函数?
- sum(), count(), avg(), min(), max()