1.什么是存储过程?有哪些优缺点?
存储过程相当于编程语言中的函数,封装了我们的代码
存储过程的优点:
- 封装代码
- 保存在数据库中
- 让编程语言调用
- 存储过程是预编译代码块,执行效率高
- 存储过程代替大量的sql语句,降低网络通信量,提高通信效率
存储过程的缺点:
- 每个数据库的存储过程语法不一样,不通用
- 业务逻辑放在数据库上,难易迭代
2.数据库范式你了解哪些?
第一范式:属性的原子性,列不可再分。(第一范式是所有关系型数据库的基础,不满足第一范式的数据库就不是关系型数据库)
第二范式:每个属性都必须完全依赖全部主键,不允许部分依赖
第三范式:每个非主属性都不传递依赖于R的候选码,不允许传递依赖
BC范式:每个属性都不传递依赖于R的候选码
3.数据库索引
什么是索引?
索引是对数据库表中一个或多个列的值进行排序的数据结构,以协助快速查询,更新数据库表中的数据
(可以这样理解,索引是加快检索表中数据的方法,索引就像字典的目录,有了这个目录你就可以快速找到某页你想要的东西)
底层的数据结构是什么?
B+树
使用这种数据结构使得查找效率高,速度快
索引的分类
- 普通索引:key
- 主键索引:primary key,主键的值非空且唯一
- 唯一索引:unique key,不允许俩行具有相同的索引值
- 全文索引:fulltext key
优点:
- 加快数据检索速度
- 加快表与表之间的连接
- 通过创建唯一性索引,可以保证数据库中每一行数据的唯一性
缺点:
- 索引需要占据物理空间
- 创建和维护索引耗费时间
4.听说过事务吗?
事务是数据库执行的最小单位,一个事务的执行要么都成功,要么都失败。
事务满足以下四大特征:
- 原子性:事务作为整体被执行,要么都成功,要么都失败
- 一致性:事务的执行保证数据库从一个一致的状态转变为另一个一致的状态
- 隔离性:多个事务并发执行时,一个事务的执行不应该影响其他事务的执行
- 持久性:事务一旦提交,对数据库的修改应该是永久保存的
事务的并发问题有哪些?
丢失更新:一个事务的更新覆盖了另一个事务的更新
脏读:一个事务读取了另一个没提交的事务数据(select)
不可重复读:在同一个事务中对同一个数据俩次读取结果不一致,主要针对修改,被读取的数据被其他事务修改了(update)
幻读:主要针对新增和删除,同样条件下俩次读出来的记录数不一样(insert delete)
事务的隔离级别有哪几种?
读未提交:允许一个事务读取另一个事务还未提交的数据
读已提交:在一个事务中,只允许对其他事务已经提交的记录可见(能避免脏读)
可重复读:其他事务对数据库的修改在本事务中不可见,增加和删除对本事务可见(能避免脏读、不可重复读)***MySQL默认隔离级别
序列化:允许事务串行执行,(都能避免、但开销大、性能极差)
5.什么是视图,视图的使用场景有哪些?
视图是一种虚拟的表,可以对数据库进行增、改、查操作。视图中可以包括一个表或多个表的行与列,对视图的操作不影响基本表,它使得我们获取数据更容易。
应用场景:
- 不希望访问者获取整个表的信息,只是暴露部分字段给访问者,所以创建一个虚表
- 查询数据来源于不同表,查询者希望以统一的方式查询,建立视图可以多表查询,效率也高
6. drop、delete、truncate的区别?
drop是删除表内容及结构、不可回滚、不可带where、删除速度快
delete是删除表中指定行数据、可回滚、可带where、删除速度慢
truncate是删除表中的内容,表结构还保留、不可回滚、不带where、删除速度快
7.触发器的作用?
触发器是与表相关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合。
触发器的这种特性可以协助应用在数据库端确保数据库的完整性
8.varchar和char的区别?
varchar和char都是数据库中用于描述字符串的类型
char是定长的;varchar是不定长的。
比如定义一个char[10]和一个varchar[10],如果存进去的都是‘test’,那么char还是占用10个长度,而varchar就会占用4个长度。所有char适合用于存放定长的字段,varchar适合用于存放不定长的字段。
char的存取速度比varchar要快
9.实践中如何优化MySQL?
MySQL的优化主要分为四部分:sql语句的优化、表结构的优化、系统配置的优化、硬件的优化
(1)sql语句优化
怎么发现有问题的sql?
- 通过MySQL慢查询日志对有效率问题的sql进行监控
- 通过explain查询和分析sql的执行计划
- sql语句的优化:
- 优化insert,一次插入多值
- 尽量避免使用*,*会遍历表两次,降低查询效率
- 用in代替or
- 尽量避免在where子句中使用!=或<>
- 尽量避免在where子句中对字段进行null值判断
- 用连接代替子查询
- 用exists代替in
(2)数据库表结构优化
- 选择合适的数据类型
- 表的范式优化
- 表的垂直拆分
- 表的水平拆分
(3)系统配置的优化
- 操作系统配置优化:增加TCP支持的队列数
(4)硬件的优化
- CPU:核心数多并且主频高的
- 内存:增大内存
- 磁盘配置和选择:磁盘性能
10.sql的执行顺序
写的顺序:select ... from... where.... group by... having... order by.. limit [offset,]
执行顺序:from、where、group by 、having、select、order by、limit
11.#{}与${}的区别
#{}是预编译的、${}是字符串替换
#{}可以防止sql注入
#{}会被替换成?、${}会被替换成变量的值
PS:有一些特殊情况只能使用${},比如 order by ${}、 like ${}
12.mysql的存储引擎
InnoDB是事务性的存储引擎、MyISAM是非事务的
InnoDB是行级锁、MyISAM是表级锁
InnoDB的执行效率没有MyISAM高
借鉴:java3y