3.存储过程和函数的区别
答案:
存储过程是用户定义的一系列sql语句的集合,涉及特定表或其它对象的任务,用户可以调用存储过程,而函数通常是数据库已定义的方法,它接收参数并返回某种类型的值并且不涉及特定用户表。
4.事务是什么?
答案:
事务是作为一个逻辑单元执行的一系列操作,一个逻辑工作单元必须有四个属性,称为?ACID(原子性、一致性、隔离性和持久性)属性,只有这样才能称为一个事务:
原子性
事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。
一致性
事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构(如?B 树索引或双向链表)都必须是正确的。
隔离性
由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。这称为可串行性,因为它能够重新装载起始数据,并且重播一系列事务,以使数据结束时的状态与原始事务执行的状态相同。
持久性
事务完成之后,它对于系统的影响是永久性的。该修改即使出现系统故障也将一直保持。
5.游标的作用?如何知道游标已经到了最后?
答案:
游标用于定位结果集的行,通过判断全局变量@@FETCH_STATUS可以判断是否到了最后,通常此变量不等于0表示出错或到了最后。
6.触发器分为事前触发和事后触发,这两种触发有何区别。语句级触发和行级触发有何区别。
答案:
事前触发器运行于触发事件发生之前,而事后触发器运行于触发事件发生之后。通常事前触发器可以获取事件之前和新的字段值。
语句级触发器可以在语句执行前或后执行,而行级触发在触发器所影响的每一行触发一次。
7.对数据库的一张表进行操作,同时要对另一张表进行操作,如何实现?
答案:
将操作多个表的操作放入到事务中进行处理。
8.触发器怎么工作的?
答案:
触发器主要是通过事件进行触发而被执行的,当对某一表进行诸如UPDATE、 INSERT、 DELETE 这些操作时,数据库就会自动执行触发器所定义的SQL 语句,从而确保对数据的处理必须符合由这些SQL 语句所定义的规则。
9.为什么使用索引?
答案:
- 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
- 可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
- 帮助服务器避免排序和临时表
- 将随机IO变为顺序IO。
- 可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
10.Innodb为什么要用自增id作为主键?
答案:
如果表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页。
如果使用非自增主键(如果身份证号或学号等),由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置, 频繁的移动、分页操作造成了大量的碎片,得到了不够紧凑的索引结构,后续不得不通过OPTIMIZE TABLE
(
optimize table
)来重建表并优化填充页面。
11.你了解MySQL的内部构造吗?一般可以分为哪两个部分?
答案:
可以分为服务层和存储引擎层两部分,其中:
服务层包括连接器、查询缓存、分析器、优化器、执行器等
,涵盖
MySQL
的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。
存储引擎层负责数据的存储和提取
。其架构模式是插件式的,支持
InnoDB
、
MyISAM
、
Memory
等多个存储引擎。现在最常用的存储引擎是InnoDB
,它从
MySQL 5.5.5
版本开始成为了默认的存储引擎。
12.说一说Drop、Delete与Truncate的共同点和区别
答案:
- Delete用来删除表的全部或者一部分数据行,执行delete之后,用户需要提交(commmit)或者回滚(rollback)来执行删除或者撤销删除,会触发这个表上所有的delete触发器。
- Truncate删除表中的所有数据,这个操作不能回滚,也不会触发这个表上的触发器,TRUNCATE比delete更快,占用的空间更小。
- Drop命令从数据库中删除表,所有的数据行,索引和权限也会被删除,所有的DML触发器也不会被触发,这个命令也不能回滚。
总结:
????????1.Drop直接删掉表;
????????2.Truncate删除表中数据,再插入时自增长id又从1开始 ;
????????3.Delete删除表中数据,可以加where字句。
13.MySQL优化了解吗?说一下从哪些方面可以做到性能优化?
答案:
- 为搜索字段创建索引
- 避免使用 Select *,列出需要查询的字段
- 垂直分割分表
- 选择正确的存储引擎
14.数据库隔离级别
答案:
未提交读
,事务中发生了修改,即使没有提交,其他事务也是可见的,比如对于一个数
A
原来
50
修改为100
,但是我还没有提交修改,另一个事务看到这个修改,而这个时候原事务发生了回滚,这时候A还是
50
,但是另一个事务看到的
A
是
100.
可能会导致脏读、幻读或不可重复读。
提交读
,对于一个事务从开始直到提交之前,所做的任何修改是其他事务不可见的,举例就是对于一个数A
原来是
50
,然后提交修改成
100
,这个时候另一个事务在
A
提交修改之前,读取的
A
是
50
,刚读取完,A
就被修改成
100
,这个时候另一个事务再进行读取发现
A
就突然变成
100
了;
可以阻止脏读,
但是幻读或不可重复读仍有可能发生。
重复读
,就是对一个记录读取多次的记录是相同的,比如对于一个数
A
读取的话一直是
A
,前后两次读取的A
是一致的;
可以阻止脏读和不可重复读,但幻读仍有可能发生。
可串行化读
,在并发情况下,和串行化的读取的结果是一致的,没有什么不同,比如不会发生脏读和幻读;该级别可以防止脏读、不可重复读以及幻读。
15.都知道数据库索引采用B+树而不是B树,原因也有很多,主要原因是什么?
答案:
主要原因:
B+
树只要遍历叶子节点就可以实现整棵树的遍历,而且在数据库中基于范围的查询是非常频繁的,而B
树只能中序遍历所有节点,效率太低。