文章目录
- **1、如何进行数据库优化?**
- **2、什么是Redis?特点是什么?**
- **3、存储过程和函数的区别**
- **4、什么是事务?**
- **5、触发器分为事前触发和事后触发,两种触发有什么区别?语句级触发和行级触发有什么区别?**
- **6、事务处理?**
- **7、JDBC如何做事务处理?写出几个在jdbc中常用的接口**
- **8、触发器的作用?**
- **9、触发器的限制有哪些?**
- **10、什么是存储过程?用什么来调用?**
- **11、索引的作用?它的优缺点是什么?**
- **12、什么样的字段适合建索引?**
- **13、索引类型有哪些?**
- **14、什么是事务?什么是锁?**
- **15、什么叫视图?游标是什么?**
- **16、视图的优缺点?**
- **17、列举几种表连接方式,有什么区别?**
- **18、主键和外键的区别?**
- **19、在数据库中查询语句速度很慢,如何优化?**
- **20、数据库三范式是什么?**
- **21、union和union all有什么不同?**
- **22、varchar2、varchar、char有什么区别?**
- **23、Oracle语句有多少类型?**
- **24、从数据库中随机取50条?**
- **25、order by与group by的区别?**
- **26、commit在哪里会运用**
- **27、序列的作用**
- **28、表和视图的关系**
- **29、Oracle基本数据类型**
- **30、truncate与 delete区别**
- **31、Oracle获取系统时间**
- **32、数据库查询结果怎么去重**
- **33、事务四大特性**
- **34、InnoDB索引和MyISAM索引的区别?**
- **35、什么是内存泄漏?**
- **36、数据库常见的锁有哪些?**
- **37、谈一谈数据库优化方面的经验?**
- 38、谈谈你对数据库中索引的理解
- 39、索引的优点和缺点
1、如何进行数据库优化?
1.建立索引 create index(索引名) on 表名(字段)索引包括聚集索引,覆盖索引,复合索引
2.拆分表
3.增加中间表
2、什么是Redis?特点是什么?
Redis:一款内存高速缓存数据库
特点:Redis以内存作为数据存储介质,所以读写数据的效率极高,远远超过数据库。Redis支持主从模式,可以配置集群,这样更利于支撑起大型的项目,这也是Redis的一大亮点。
3、存储过程和函数的区别
存储过程是用户定义的一系列sql语句的集合,涉及特定表或者其他对象的任务,用户可以调用存储过程,而函数通常是数据库已定义的方法,它接受参数并返回某种类型的值并且不涉及特定用户表。
4、什么是事务?
事务是作为一个逻辑单元执行的一系列操作,一个逻辑工作单元必须有四个属性,称为ACID(原子性、一致性、隔离性和持久性)属性,只有这样才能成为一个事务:
原子性:事务必须是原子工作单元,对于其数据修改,要么全都执行,要么全都不执行。
一致性:事务在完成时,必须使所有的数据保持一致的状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构(如B树索引或双向链表)都必须是正确的。
隔离性:由并发事务所做的修改必须与任何其他并发事务所做的修改隔离。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一并发事务修改它之后的状态,事务不会查看中间状态的数据。这称为可串行性,因为它能够重新装载起始数据,并且重播一系列事务,以使数据结束时的状态与原始事务执行的状态相同。
持久性:事务完成后,它对于系统的影响是永久性的。该修改即使出现系统故障也将一直保持。
5、触发器分为事前触发和事后触发,两种触发有什么区别?语句级触发和行级触发有什么区别?
事前触发运行于触发事件发生之前,而事后触发运行于触发事件发生之后。通常事前触发器可以获取事件之前和新的字段值。
语句级触发可以在语句执行前或后执行,而行级触发在触发器所影响的每一行触发一次。
6、事务处理?
Connection类中提供了3个事务处理方法:
setAutoCommit(Boolean autoCommit):设置是否自动提交事务,默认为自动提交事务,即为true,通过设置false禁止自动提交事务;
Commit():提交事务;
Rollback():回滚事务。
7、JDBC如何做事务处理?写出几个在jdbc中常用的接口
Con.setAutoCommit(false);
Con.commit();
Con.rollback();
常用接口:
DriverManager,Connection,preparedStatement,statement,ResultSet
8、触发器的作用?
· 触发器是一种特殊的存储过程,主要是通过事件来触发而被执行的。
· 它可以强化约束,来维护数据的完整性和一致性。
· 可在写入数据表前,强制检验或转换数据。
· 触发器发生错误时,异动的结果会被撤销。
· 部分数据库管理系统可以针对数据定义语言(DDL)使用触发器,称为DDL触发器。
· 可依照特定的情况,替换异动的指令 (INSTEAD OF)。
9、触发器的限制有哪些?
· 一个表最多只能有三个触发器,insert、update、delete
· 每个触发器只能用于一个表
· 不能对视图、临时表创建触发器
· Truncate table能删除表,但不能触发触发器
10、什么是存储过程?用什么来调用?
· 存储过程存在于大型数据库系统中,是一个预编译的SQL语句(为了完成特定功能的SQL 语句集),经过第一次编译后再次调用不需要再次编译。
- 优点是:
- 允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。
- 如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。
- 减少网络流量。存储过程位于服务器上,调用的时候只需要传递存储过程的名称以及参数就可以了,因此降低了网络传输的数据量。
- 安全性。参数化的存储过程可以防止SQL注入式攻击,而且可以将Grant、Deny以及Revoke权限应用于存储过程。
- 调用:
- 1)可以用一个命令对象来调用存储过程。
- 2)可以供外部程序调用,比如:java程序。
11、索引的作用?它的优缺点是什么?
· 索引就一种特殊的查询表,数据库的搜索可以利用它加速对数据的检索。
· 它很类似与现实生活中书的目录,不需要查询整本书内容就可以找到想要的数据。
· 索引可以是唯一的,创建索引允许指定单个列或者是多个列。
· 缺点是它减慢了数据录入的速度,同时也增加了数据库的尺寸大小。
12、什么样的字段适合建索引?
· 唯一
· 主、外键
· 不为空
· 表之间的关联字段
· 查询比较频繁的字段
13、索引类型有哪些?
Single column 单行索引
Concatenated 多行索引
Unique 唯一索引
NonUnique 非唯一索引
Function-based 函数索引
Domain 域索引 物理上:
Partitioned 分区索引
NonPartitioned 非分区索引
B-tree :
Normal 正常型B树
Rever Key 反转型B树
Bitmap 位图索引
14、什么是事务?什么是锁?
- 事务就是被绑定在一起作为一个逻辑工作单元的SQL语句分组
如果任何一个语句操作失败那么整个操作就被失败,以后操作就会回滚到操作前状态,或者是上有个节点。
为了确保要么执行,要么不执行,就可以使用事务。
要将有组语句作为事务考虑,就需要通过ACID测试:
即原子性,一致性,隔离性和持久性。
- 锁:锁是实现事务的关键,锁可以保证事务的完整性和并发性。
与现实生活中锁一样,它可以使某些数据的拥有者,在某段时间内不能使用某些数据或数据结构。
当然锁还分级别的,比如页级锁、行级锁等。
15、什么叫视图?游标是什么?
- 视图:是一种虚拟的表,具有和物理表相同的功能。
可以对视图进行增,改,查,操作,试图通常是有一个表或者多个表的行或列的子集。
对视图的修改会影响基本表。它使得我们获取数据更容易,相比多表查询。
- 游标:是对查询出来的结果集作为一个单元来有效的处理。
游标可以定在该单元中的特定行,从结果集的当前行检索一行或多行。
可以对结果集当前行做修改。
一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要。
16、视图的优缺点?
- 优点:
- 对数据库的访问,因为视图可以有选择性的选取数据库里的一部分。
- 用户通过简单的查询可以从复杂查询中得到结果。
- 维护数据的独立性,试图可从多个表检索数据。
- 对于相同的数据可产生不同的视图。
- 缺点:
- 性能:查询视图时,必须把视图的查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,那么,那么就无法更改数据
17、列举几种表连接方式,有什么区别?
- 内连接、自连接、外连接(左、右、全)、交叉连接
- 内连接:只有两个元素表相匹配的才能在结果集中显示。
- 外连接:
- 左外连接:左边为驱动表,驱动表的数据全部显示,匹配表的不匹配的不会显示。
- 右外连接:右边为驱动表,驱动表的数据全部显示,匹配表的不匹配的不会显示。
- 全外连接:连接的表中不匹配的数据全部会显示出来。
- 交叉连接: 笛卡尔效应,显示的结果是链接表数的乘积。
18、主键和外键的区别?
· 主键在本表中是唯一的、不可唯空的,外键可以重复可以唯空;
· 外键和另一张表的主键关联,不能创建对应表中不存在的外键。
19、在数据库中查询语句速度很慢,如何优化?
· 建索引
· 减少表之间的关联
· 优化sql,不要让sql做全表查询
· 简化查询字段,没用的字段不要,已经对返回结果的控制,尽量返回少量数据
· 尽量用PreparedStatement来查询,不要用Statement
20、数据库三范式是什么?
· 第一范式:列不可再分
· 第二范式:行可以唯一区分,主键约束
· 第三范式:表的非主属性不能依赖与其他表的非主属性外键约束,且三大范式是一级一级依赖的,第二范式建立在第一范式上,第三范式建立第一第二范式上
21、union和union all有什么不同?
· UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。
实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表UNION。
· UNION ALL只是简单的将两个结果合并后就返回。这样,如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数据了。
· 从效率上说,UNION ALL 要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复的数据的话,那么就使用UNION ALL。
22、varchar2、varchar、char有什么区别?
- Char的长度是固定的,而varchar2的长度是可以变化的
比如,存储字符串“abc”对于char(20),表示你存储的字符将占20个字节,包含17个空,而同样的varchar2(20)只占了3个字节,20只是最大值,当你存储的字符小于20时,按实际长度存储。
- char的效率要被varchar2的效率高。
- 目前varchar是varchar2的同义词
工业标准的varchar类型可以存储空字符串,但是oracle不能这样做,尽管它保留以后这样做的权利。
Oracle自己开发了一个数据类型varchar2,这个类型不是一个标准的varchar,他将在数据库中varchar列可以存储空字符串的特性改为存储null值,如果你想有向后兼容的能力,oracle建议使用varchar2而不是varchar
23、Oracle语句有多少类型?
- Oracle语句分三类:DDL、DML、DCL。
- DDL(Data Definition Language)数据定义语言,包括:
- Create语句:可以创建数据库和数据库的一些对象。
- Drop语句:可以删除数据表、索引、触发程序、条件约束以及数据表的权限等
- Alter语句:修改数据表定义及属性。
- Truncate语句:删除表中的所有记录,包括所有空间分配的记录被删除。
- DML(Data Manipulation Language)数据操控语言,包括:
- Insert语句:向数据表张插入一条记录。
- Delete语句:删除数据表中的一条或多条记录,也可以删除数据表中的所有记录,但是它的操作对象仍是记录。
- Update语句:用于修改已存在表中的记录的内容。
- DCL(Data Control Language)数据库控制语言,包括:
- Grant语句:允许对象的创建者给某用户或某组或所有用户(PUBLIC)某些特定的权限。
- Revoke语句:可以废除某用户或某组或所有用户访问权限
24、从数据库中随机取50条?
· ORACLE
- select * from (select * from t_example order by dbms_random.value) where rownum <= 50
· MYSQL
- select * from hj_user order by rand() limit 50
· SQLServer
- select top 20 * from tableName order by newid()
25、order by与group by的区别?
- order by 排序查询、asc升序、desc降序
- group by 分组查询、having 只能用于group by子句、作用于组内。
having条件子句可以直接跟函数表达式。
使用group by 子句的查询语句需要使用聚合函数。
26、commit在哪里会运用
- Oracle的commit就是DML语句提交数据(这里是释放锁不是锁表),在未提交前你前面的操作更新的都是内存,没有更新到物理文件中。
- 执行commit从用户角度讲就是更新到物理文件了,事实上commit时还没有写date file,而是记录了redo log file,要从内存写到data物理文件,需要触发检查点,由DBWR这个后台进程来写,这里内容有点多的,如果不深究的话你就理解成commit即为从内存更新到物理文件。
- insert以后commit之前是锁表的状态,其他事务无法对该表进行操作
- 如果不提交的话,那么这个表就被锁了
27、序列的作用
· Oracle使用序列来生成唯一编号,用来处理一个表中自增字段。
· Oracle序列是原子对象,并且是一致的。
也就是说,一旦您访问一个序列号,Oracle将在处理下一个请求之前自动递增下一个编号,从而确保不会出现重复值。
28、表和视图的关系
· 视图其实就是一条查询sql语句,用于显示一个或多个表或其他视图中的相关数据。
· 表就是关系数据库中实际存储数据用的。
29、Oracle基本数据类型
· 字符串类型:char、nchar、varchar、varchar2、nvarchar2
· 数字类型: number、integer
· 浮点类型: binary_float、binary_double、float
· 日期类型: date、 timestamp
· LOB类型: blob、clob、nclob、bfile
30、truncate与 delete区别
- TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少。
- DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。
- TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。
- TRUNCATE、DELETE、DROP 比较:
- TRUNCATE TABLE :删除内容、释放空间但不删除定义。
- DELETE TABLE: 删除内容不删除定义,不释放空间。
- DROP TABLE :删除内容和定义,释放空间。
31、Oracle获取系统时间
- select to_char(sysdate, 'yyyy-MM-dd HH24:mi:ss') from dual;
32、数据库查询结果怎么去重
· 使用distinct关键字
33、事务四大特性
- ACID:
- 原子性:要么执行,要么不执行
- 隔离性:所有操作全部执行完以前,其它会话不能看到过程
- 一致性:事务前后,数据总额一致
- 持久性:一旦事务提交,对数据的改变就是永久的
34、InnoDB索引和MyISAM索引的区别?
· 主索引的区别,InnoDB的数据文件本身就是索引文件。而MyISAM的索引和数据是分开的。
· 辅助索引的区别:InnoDB的辅助索引data域存储相应记录主键的值而不是地址。而MyISAM的辅助索引和主索引没有多大区别。
· MyISAM表锁,不支持事务,表损坏率较高
· InnoDB行锁,支持事务
35、什么是内存泄漏?
- 一般我们所说的内存泄漏指的是堆内存的泄漏。堆内存是程序从堆中为其分配的,大小任意的,使用完后要显示释放内存。
- 当应用程序用关键字new等 创建对象时,就从堆中为它分配一块内存,使用完后程序调用free或者delete释放该内存,否则就说该内存就不能被使用,我们就说该内存被泄漏了。
36、数据库常见的锁有哪些?
- 行锁,表锁;乐观锁,悲观锁
- 行锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高
- 表锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低
- 悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作
- 乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。不能解决脏读问题
37、谈一谈数据库优化方面的经验?
从三方面去回答:
- 1:数据库设计
- 数据库表:字段类型、字段长度、注释、字段命名规范
- 数据库索引:外键、关联字段、查询频率比较高的字段、
如果数据表字段>20,则最多支持16个索引
如果数据表字段<20,则根据查询频率字段来定
- 数据库视图:相当于一张临时表,业务中,尽量少使用
- 数据库引擎:根据业务,选择对应的表引擎技术
- 数据库存储过程:尽量少用
- 数据库字符:UTF-8、或者和页面字符保持一致
- 数据库监听器/触发器:一般用于调度任务或者备份还原
- 2:业务调用的sql语句优化
- 尽量少关联表,效率最高关联4张表,如果多于4张表,则需要开启两个链接事务,但是这两个事务,必须在一个service当中。
- 如果是查询语句,则不建议使用*
- 如果是查询语句,where条件后面,最好使用索引字段进行关联
- 3:数据库服务器的搭建(集群)
- 主从配置:
- 读写分离:
- 自动化(容器):
38、谈谈你对数据库中索引的理解
1、首先要明白为什么要用索引:因为数据中的记录很多,为了方便我们查找,提高查询的效率;
2、索引的原理:对要查询的字段建立索引其实就是把该字段按照一定的方式排序;建立的索引只对该字段有用,如果查询的字段改变,那么这个索引也就无效了,比如图书馆的书是按照书名的第一个字母排序的,那么你想要找作者叫张三的就不能用改索引了;还有就是如果索引太多会降低查询的速度
3、索引是优缺点:
首先明白为什么索引会增加速度,DB在执行一条Sql语句的时候,默认的方式是根据搜索条件进行全表扫描,遇到匹配条件的就加入搜索结果集合。如果我们对某一字段增加索引,查询时就会先去索引列表中一次定位到特定值的行数,大大减少遍历匹配的行数,所以能明显增加查询的速度。那么在任何时候都应该加索引么?这里有几个反例:1、如果每次都需要取到所有表记录,无论如何都必须进行全表扫描了,那么是否加索引也没有意义了。2、对非唯一的字段,例如“性别”这种大量重复值的字段,增加索引也没有什么意义。3、对于记录比较少的表,增加索引不会带来速度的优化反而浪费了存储空间,因为索引是需要存储空间的,而且有个致命缺点是对于update/insert/delete的每次执行,字段的索引都必须重新计算更新。所以并不是任何情况下都改建立索引的
39、索引的优点和缺点
一、为什么要创建索引呢(优点)?
这是因为,创建索引可以大大提高系统的性能。
第一, 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
第二, 可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
第三, 可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
第四, 在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
第五, 通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
二、建立方向索引的不利因素(缺点)
也许会有人要问:增加索引有如此多的优点,为什么不对表中的每一个列创建一个索引呢?这种想法固然有其合理性,然而也有其片面性。虽然,索引有许多优点,但是,为表中的每一个列都增加索引,是非常不明智的。这是因为,增加索引也有许多不利的一个方面。
第一, 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
第二, 索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
第三, 当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。