1.MYSQL数据库引擎区别sql
· MyISAM:默认的MySQL插件式存储引擎,它是在Web、数据仓储和其余应用环境下最常使用的存储引擎之一。注意,经过更改STORAGE_ENGINE配置变量,可以方便地更改MySQL服务器的默认存储引擎。
· InnoDB:用于事务处理应用程序,具备众多特性,包括ACID事务支持。(提供行级锁)
· BDB:可替代InnoDB的事务引擎,支持COMMIT、ROLLBACK和其余事务特性。
· Memory:将全部数据保存在RAM中,在须要快速查找引用和其余相似数据的环境下,可提供极快的访问。
· Merge:容许MySQL DBA或开发人员将一系列等同的MyISAM表以逻辑方式组合在一块儿,并做为1个对象引用它们。对于诸如数据仓储等VLDB环境十分适合。
· Archive:为大量不多引用的历史、归档、或安全审计信息的存储和检索提供了完美的解决方案。
· Federated:可以将多个分离的MySQL服务器连接起来,从多个物理服务器建立一个逻辑数据库。十分适合于分布式环境或数据集市环境。
· Cluster/NDB:MySQL的簇式数据库引擎,尤为适合于具备高性能查找要求的应用程序,这类查找需求还要求具备最高的正常工做时间和可用性。
· Other:其余存储引擎包括CSV(引用由逗号隔开的用做数据库表的文件),Blackhole(用于临时禁止对数据库的应用程序输入),以及Example引擎(可为快速建立定制的插件式存储引擎提供帮助)。
通常来讲不使用事务的话,请使用MyISAM引擎,使用事务的话,通常使用InnoDB2.数据库
2.SQL请写一段SQL取出数据表中name重复的数据。(注意只须要重复的) 缓存
答:SELECT * FROM member GROUP BY name having count(*)>1;tomcat
3.数据库索引使用注意安全
数据库索引是为了加快查询速度,可是会下降更新插入删除的速度;若是每次都要获取全部表记录,那么增长索引意义就不大了;对于大量重复值的字段增长索引也是没意义的。针对记录比较少的表增长索引反而会浪费存储空间,而不会加快速度服务器
4.几千G的数据怎么查询一条记录比较快网络
经过增长索引、几千G数据放一张表不大现实,能够经过分区,不过度区又会增长查询难度;并发
5. 数据库链接池原理、好处,tomcat中什么位置增长?oracle
原理:是在内部对象池中维护必定数量的数据库链接,并对外暴露数据库链接获取和返回方法。分布式
好处:对于一个复杂的数据库应用,频繁的创建、关闭链接,会极大的减低系统的性能,由于对于链接的使用成了系统性能的瓶颈。数据库链接池技术带来的优点:
1)资源重用
2)更快的系统响应速度
3)新的资源分配手段
4)统一的链接管理,避免数据库链接泄漏
Tomcat配置位置:在tomcat的context.xml中指定Resource的JNDI名称;
6.数据库冷备份和热备份的不一样点以及各自的优势
热备份针对归档模式的数据库,在数据库仍旧处于工做状态时进行备份。而冷备份指在数据库关闭后,进行备份,适用于全部模式的数据库。
热备份的优势在于当备份时,数据库仍旧能够被使用而且能够将数据库恢复到任意一个时间点。冷备份的优势在于它的备份和恢复操做至关简单,而且因为冷备份的数据库能够工做在非归档模式下,数据库性能会比归档模式稍好。
7.MySQL存储过程和函数有什么区别?
在本质上它们都是存储程序。函数只能经过return语句返回单个值或者表对象;而存储过程 不容许执行return,可是能够经过out参数返回多个值。函数限制比较多,不能用临时表,只能用表变量,还有一些函数都不可用等等;而存储过程的限制相对就比较少。函数能够嵌入在SQL 语句中使用,能够在SELECT语句中做为查询语句的一个部分调用;而存储过程通常是做为一个独立的部分来执行。
(1)存储过程当中的代码能够改变吗?
目前,MySQL还不提供对已存在的存储过程代码的修改,若是必需要修改存储过程,必须使用DROP语句删除以后,再从新编写代码,或者建立一个新的存储过程。
(2)存储过程当中能够调用其余存储过程吗?
存储过程包含用户定义的SQL语句集合,可使用CALL语句调用存储过程,固然在存储 过程当中也可使用CALL语句调用其余存储过程,可是不能使用DROP语句删除其余存储过程。
(3)存储过程的参数不要与数据表中的字段名相同。
在定义存储过程参数列表时,应注意把参数名与数据库表中的字段名区别开来,不然将出 现没法预期的结果。
(4)存储过程的参数可使用中文吗?
通常状况下,可能会出现存储过程当中传入中文参数的状况,例如某个存储过程根据用户的 名字查找该用户的信息,传入的参数值多是中文。这时须要在定义存储过程的时候,在后面加 上character set gbk,否则调用存储过程使用中文参数会出错,好比定义userInfo存储过程,代码 以下:CREATE PROCEDURE useInfo(IN u_name VARCHAR(50) character set gbk, OUT u_age INT)
(5)存储过程优势
一、数据库已经编译过了,一次性编译
二、执行速度快
三、能够重复使用
四、安全性高
一、模块化、提升程序安全性
二、减小网络流量
三、提升系统性能、减轻工做站负荷
四、重复执行
存储过程比直接写SQL语句执行起来的速度快。
正如你所说的,存储过程在执行时是会被SQL优化缓存的,而SQL语句则没有。
8.数据库事务特色
原子性:要么全都执行,要么全都不执行。
一致性:事务在完成时,必须使全部的数据都保持一致状态。
隔离性:由并发事务所做的修改必须与任何其它并发事务所做的修改隔离。
持久性:事务完成以后,它对于系统的影响是永久性的。
9.数据库三大范式
范式一:每一字段只存储一个值
范式二:必须先符合范式一的条件,且每一行都能被惟一的识别。将范式一转换成范式二的方法是添加主键。
范式三:没有一个非关键属性依赖于另外一个非关键属性。
10.数据库锁机制
1).数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁)。当数据对象被加上排它锁时,其余的事务不能对它读取和修改。加了共享锁的数据对象能够被其余事务读取,但不能修改。
2).悲观封锁、乐观封锁和死锁
悲观封锁:
锁在用户修改以前就发挥做用:
Select ..for update(nowait)
Select * from tab1 for update
用户发出这条命令以后,oracle将会对返回集中的数据创建行级封锁,以防止其余用户的修改。
若是此时其余用户对上面返回结果集的数据进行dml或ddl操做都会返回一个错误信息或发生阻塞。
乐观封锁
乐观的认为数据在select出来到update进取并提交的这段时间数据不会被更改。这里面有一种潜在的危险就是因为被选出的结果集并无被锁定,是存在一种可能被其余用户更改的可能。所以Oracle仍然建议是用悲观封锁,由于这样会更安全。
死锁
当两个用户但愿持有对方的资源时就会发生死锁.
即两个用户互相等待对方释放资源时,oracle认定为产生了死锁,在这种状况下,将以牺牲一个用户做为代价,另外一个用户继续执行,牺牲的用户的事务将回滚。
11.甚么时候会出现事务回滚,而甚么时候不会出现事务回滚?如何设计事务回滚。
能够在抛出异常的时候加入事务回滚方法;若数据库不支持回滚,可给记录行设定状态序号和历史状态序号,更新前先设定状态序号,若是成功了就把这个状态序号设成历史序号以表示提交,若是失败了就把原始数据给恢复过来以回滚。
12.Orcale如何实现查询出来的空值变成0?
答:真的要是把空值用0表示的话,oracle中有nvl函数
select nvl(columnName,0) from table
意思就是把columnName字段为空的显示成0,固然也能够显示成任何字符或者数字
13.Orcale如何实现查询出来的两个字段放在一个位置上?
答:oracle数据库
select A || ':' || B from t
前提是A B字段都是字符型,假如不是,就用to_char()方法转换成字符型
14.触发器的具体含义和用法
触发器是编写的一段SQL语句,其关键字是TRIGGER(触发器的意思),它附着于指定的表,做用主要在于监控其附着的表在产生特定动做时应作的SQL处理,使用触发器的好处在于大大简化了相关表的维护,将数据一致性问题交由数据库后台处理。
在使用触发器的时候须要注意,对于相同的表,相同的事件只能建立一个触发器,好比对 表account建立了一个BEFORE INSERT触发器,那么若是对表account再次建立一个BEFORE INSERT触发器,MySQL将会报错,此时,只能够在表account上建立AFTER INSERT或者 BEFORE UPDATE类型的触发器。灵活的运用触发器将为操做省去不少麻烦。
触发器定义以后,每次执行触发事件,都会激活触发器并执行触发器中的语句。若是需求 发生变化,而触发器没有进行相应的改变或者删除,则触发器仍然会执行旧的语句,从而会影响 新的数据的完整性。所以,要将再也不使用的触发器及时删除。
15.对内外链接的理解?
(1)、内链接:select * from a inner join b on a.id = b.id;
只显示a.id与b.id相同的行,左边显示a表的字段,右边显示b表的字段;
(2)、左外链接:select * from a left join b on a.id = b.id;
左边显示a表的字段并显示全部数据,右边显示b表的字段,只显示a.id与b.id相同的行,其余用null补充;
(3)、右外链接:select * from a right join b on a.id=b.id;
右边显示b表的字段并显示全部数据,左边显示a表的字段,只显示a.id与b.id相同的行,其余用null补充;
(4)、彻底外链接:select * from a full join b on a.id=b.id;
左边显示a表字段,右边显示b表的字段;其中a.id与b.id相同的行全显示,a.id与b.id不一样的行,在a表中有数据的行在b中用null填充,在b表中有数据的行在a表中用null填充;
(5)、交叉链接:select * from a cross join b;
返回的行数是左边与右边行数的乘积;
16.Statement,PreparedStatement,CallableStatement区别
1).PreparedStatement是预编译的,并支持批处理,对于批量处理能够大大提升效率. 也叫JDBC存储过程;能够传参数,在获得PreparedStatement对象时肯定sql.
2).使用 Statement 对象。在对数据库只执行一次性存取的时侯,用 Statement 对象进行处理。
statement用于执行静态 SQL 语句并返回它所生成结果的对象,在执行时肯定sql。
3).CallableStatement用于执行 SQL 存储过程的接口。若是有输出参数要注册说明是输出参数。
17.是否是索引创建得越多越好?
合理的索引能够提升查询的速度,但不是索引越多越好。在执行插入语句的时候,MySQL 要为新插入的记录创建索引。因此过多的索引会致使插入操做变慢。原则上是只有查询用的字段 才创建索引。
查询缓冲区能够提升查询的速度,可是这种方式只适合查询语句比较多、更新语句比较少 的状况。默认状况下查询缓冲区的大小为〇,也就是不可用。能够修改queiy_cache_size以调整 查询缓冲区大小;修改query_cache_type以调整查询缓冲区的类型。在my.ini中修改 query_cache_size 和 query_cache_type 的值