数据库理论
1.触发器的作用?
触发器是一种特殊的存储过程,主要是通过事件来触发而被执行的。它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。
可以联级运算。如,某表上的触发器上包含对另一个表的数据操作,而该操作又会导致该表触发器被触发。
2.什么是存储过程?用什么来调用?
存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。
如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。可以用一个命令对象来调用存储过程。
3.索引的作用?和它的优点缺点是什么?
索引就是一种特殊的查询表,数据库的搜索引擎可以利用它加速对数据的检索。它很类似与现实生活中书的目录,不需要查询整本书内容就可以找到想要的数据。
索引可以是唯一的,创建索引允许指定单个列或者是多个列。缺点是它减慢了数据录入的速度,同时也增加了数据库的尺寸大小。
4.什么是内存泄漏?
一般我们所说的内存泄漏指的是堆内存的泄漏。堆内存是程序从堆中为其分配的,大小任意的,使用完后要显示释放内存。
在Java中,内存泄漏就是存在一些被分配的对象,首先,这些对象是可达的,即在有向图中,存在通路可以与其相连;其次,这些对象是无用的,即程序以后不会再使用这些对象。如果对象满足这两个条件,这些对象就可以判定为Java中的内存泄漏,这些对象不会被GC所回收,然而它却占用内存。
在C++中,内存泄漏的范围更大一些。有些对象被分配了内存空间,然后却不可达,由于C++中没有GC,这些内存将永远收不回来。在Java中,这些不可达的对象都由GC负责回收,因此程序员不需要考虑这部分的内存泄露。
5.维护数据库的完整性和一致性,你喜欢用触发器还是自写业务逻辑?为什么?
我是这样做的,尽可能使用约束,如check,主键,外键,非空字段等来约束,这样做效率最高,也最方便。
其次是使用触发器,这种方法可以保证,无论什么业务系统访问数据库都可以保证数据的完整新和一致性。
最后考虑的是自写业务逻辑,但这样做麻烦,编程复杂,效率低下。
6.什么叫视图?游标是什么?
视图是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,视图通常是有一个表或者多个表的行或列的子集。
对视图的修改不影响基本表。它使得我们获取数据更容易,相比多表查询。
游标是对查询出来的结果集作为一个单元来有效的处理。
游标可以定在该单元中的特定行,从结果集的当前行检索一行或多行。可以对结果集当前行做修改。一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要。
7.表空间的管理方式有哪几种?
数据字典管理方式
本地文件管理方式
8.说说索引的组成?
索引列、rowid
9.DELETE和TRUNCATE的区别?
1、TRUNCATE在各种表上无论是大的还是小的都非常快。如果有ROLLBACK命令DELETE将被撤销,而TRUNCATE则不会被撤销。
2、TRUNCATE是一个DDL语言,向其他所有的DDL语言一样,他将被隐式提交,不能对TRUNCATE使用ROLLBACK命令。
3、TRUNCATE将重新设置高水平线和所有的索引。在对整个表和索引进行完全浏览时,经过TRUNCATE操作后的表比DELETE操作后的表要快得多。
4、TRUNCATE不能触发任何DELETE触发器。
5、不能授予任何人清空他人的表的权限。
6、当表被清空后表和表的索引讲重新设置成初始大小,而delete则不能。
7、不能清空父表。
10.什么是唯一索引?
唯一索引可以确保索引列不包含重复的值。
在多列唯一索引的情况下,该索引可以确保索引列中每个值组合都是唯一的。例如,如果在 last_name、first_name 和 middle_initial 列的组合上创建了唯一索引 full_name,则该表中任何两个人都不可以具有相同的全名。
聚集索引和非聚集索引都可以是唯一的。因此,只要列中的数据是唯一的,就可以在同一个表上创建一个唯一的聚集索引和多个唯一的非聚集索引。
只有当唯一性是数据本身的特征时,指定唯一索引才有意义。如果必须实施唯一性以确保数据的完整性,则应在列上创建 UNIQUE 或 PRIMARY KEY 约束,而不要创建唯一索引。例如,如果打算经常查询雇员表(主键为 emp_id)中的社会安全号码 (ssn) 列,并希望确保社会安全号码的唯一性,则在 ssn 列上创建 UNIQUE 约束。如果用户为一个以上的雇员输入了同一个社会安全号码,则会显示错误。
11.SQL里面IN比较快还是EXISTS比较快?
EXISTS比较快因为EXISTS返回一个Boolean型而IN返回一个值。
12.Oracle中,rowid和rownum有什么不同?
注意 MySQL不支持行号的使用。
RowId是一个数据库内部的概念,表示表的一行,用来快速的访问某行数据
Rownum是结果集的一个功能, 例如select * from Student where rownum = 2 就是得到结果集的第二行。
13.delete, truncate 和 drop的区别?
Delete命令用来删除表的全部或者一部分数据行,执行delete之后,用户需要提交(commmit)或者回滚(rollback) transaction 来执行删除或者撤销删除, delete命令会触发这个表上所有的delete触发器。
Truncate删除表中的所有数据, 这个操作不能回滚,也不会触发这个表上的触发器,TRUNCATE比delete更快,占用的空间更小。
Drop命令从数据库中删除表, 所有的数据行,索引和权限也会被删除,所有的DML触发器也不会被触发,这个命令也不能回滚。
14.MySQL存储过程常用的方法有哪些?
创建 MySQL 存储过程的简单语法为:
1
2
3
4
5
6
7
|
create procedure 存储过程名字()
(
[in|out|inout] 参数 datatype
)
begin
MySQL 语句;
end;
|
可以使用call来调用存储过程。
1
2
3
4
5
|
Java中,类CallableStatement为Java程序提供了一种调用存储过程的方法。CallableStatement对象可以带有用于输入数据 (IN模式参数),输出结果(OUT模式参数) 或者用于上面这两种功能的参数(IN OUT模式参数)。
下面是在JDBC中调用存储过程的语法。需要注意的是语法中的方括号只是用于表示可选参数的,它不是命令语法的一部分。
{call procedure_name([?, ?, ...])}
下面是调用可以返回结果参数值的存储过程的语法:
{? = call procedure_name([?, ?, ...])}
|
15.mysql如何实现分页查询?
16.建数据库需要遵循哪些原则?应该注意哪些方面?
17.MySQL数据库有哪些类型的索引?
MySQL主要提供2种方式的索引:B-Tree索引,Hash索引。
B树索引具有范围查找和前缀查找的能力,对于有N节点的B树,检索一条记录的复杂度为O(LogN)。相当于二分查找。
哈希索引只能做等于查找,但是无论多大的Hash表,查找复杂度都是O(1)。
显然,如果值的差异性大,并且以等值查找(=、 <、>、in)为主,Hash索引是更高效的选择,它有O(1)的查找复杂度。
如果值的差异性相对较差,并且以范围查找为主,B树是更好的选择,它支持范围查找。
18.如何创建索引,什么时候该创建、什么时候不应该创建?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
创建索引的标准语法:
CREATE INDEX 索引名 ON 表名 (列名)
TABLESPACE 表空间名;
创建唯一索引:
CREATE unique INDEX 索引名 ON 表名 (列名)
TABLESPACE 表空间名;
创建组合索引:
CREATE INDEX 索引名 ON 表名 (列名
1
,列名
2
)
TABLESPACE 表空间名;
创建反向键索引:
CREATE INDEX 索引名 ON 表名 (列名) reverse
TABLESPACE 表空间名;
|
什么情况下应不建或少建索引
表记录太少
如果一个表只有5条记录,采用索引去访问记录的话,那首先需访问索引表,再通过索引表访问数据表,一般索引表与数据表不在同一个数据块,这种情况下DB至少要往返读取数据块两次。而不用索引的情况下DB会将所有的数据一次读出,处理速度显然会比用索引快。
经常插入、删除、修改的表
对一些经常处理的业务表应在查询允许的情况下尽量减少索引。
数据重复且分布平均的表字段
假如一个表有10万行记录,有一个字段A只有T和F两种值,且每个值的分布概率大约为50%,那么对这种表A字段建索引一般不会提高数据库的查询速度。
19.mysql如何实现分库分表,分哪几个步骤?
一般情况下,都可以对主键ID取模,做Hash,散列到多个表中。
比如我要对User表做分表操作,分散到一百个表中:
<?php
for(i=0;i< 100; i++ ){ //echo "CREATE TABLE db2.members{i} LIKE db1.members<br>";
echo "INSERT INTO members{i} SELECT * FROM members WHERE mid%100={i}<br>";
}
?>
20.如何实现范式和反范式?
范式是关系数据库理论的基础,也是我们在设计数据库结构过程中所要遵循的规则和指导方法。
目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,还又称完美范式)。
各种范式呈递次规范,越高的范式数据库冗余越小。
不满足范式的模型,就是反范式模型。
反范式跟范式所要求的正好相反,在反范式的设计模式,我们可以允许适当的数据的冗余,用这个冗余去取操作数据时间的缩短。本质上就是用空间来换取时间,把数据冗余在多个表中,当查询时可以减少或者是避免表之间的关联;
RDBMS模型设计过程中,常常使用范式约束我们的模型,但在NOSQL模型中则大量采用反范式。
21.举一个反范式设计的例子?
数据库设计要严格遵守范式,这样设计出来的数据库,虽然思路很清晰,结构也很合理,但是,有的时候,却要在一定程度上打破范式设计。
这里其实并不矛盾,因为范式越高,设计出来的表可能越多,关系可能越复杂,但是性能却不一定会很好,因为表一多,就增加了关联性。特别是在高可用的OLTP数据库中,这一点表现得很明显。
最明显的打破范式的设计方法就是冗余法,以空间换取时间的做法,把数据冗余在多个表中,当查询时可以减少或者是避免表之间的关联。
还是用上面的例子,学生表与课程表,假定课程表要经常被查询,而且在查询中要显示学生的姓名,查询语句则为:
SQL>select code,name,subject from course c, |
这个语句如果被大范围、高频率执行,可能会因为表关联造成一定程度的影响,现在,假定评估到学生改名的需求是非常少的,那么,就可以把学生姓名冗余到课程表中,又变回了如表所示:
ID(PK) |
编号 |
姓名 |
选修科目 |
1 |
001 |
张三 |
语文 |
2 |
001 |
张三 |
数学 |
3 |
001 |
张三 |
英语 |
4 |
002 |
李四 |
物理 |
5 |
002 |
李四 |
化学 |
6 |
003 |
王五 |
历史 |
7 |
003 |
王五 |
地理 |
8 |
003 |
王五 |
生物 |
注意:我这里并没有省略学生表,不过是把学生姓名冗余在了课程表中,如果万一有很少的改名需求,只要保证在课程表中改名正确即可。
那么,修改以后的语句可以简化为:
SQL>select code,name,subject from course c where code=?
|
MySQL相关
1.MySQL的几种存储引擎