面试题系列四:数据库(必问)
1.索引
1.1 使用场景?
1.2 索引分类?
MySQL索引包括普通索引、唯一索引、全文索引、单列索引、多列索引、空间索引
1.3 索引作用和优缺点?
索引就一种特殊的查询表,数据库的搜索可以利用它加速对数据的检索。
它很类似与现实生活中书的目录,不需要查询整本书内容就可以找到想要的数据。
索引可以是唯一的,创建索引允许指定单个列或者是多个列。
缺点是它减慢了数据录入的速度,同时也增加了数据库的尺寸大小
1.4 索引不会命中?
1.5主键和唯一索引?
2.两种存储引擎
- MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。如果应用中需要执行大量的SELECT查询,那么MyISAM是更好的选择。
- InnoDB用于事务处理应用程序,具有众多特性,包括ACID事务支持。如果应用中需要执行大量的INSERT或UPDATE操作,则应该使用InnoDB,这样可以提高多用户并发操作的性能。
主要区别:
-
MyISAM是非事务安全型的,而InnoDB是事务安全型的。
-
MyISAM锁的粒度是表级,而InnoDB支持行级锁定。
-
MyISAM支持全文类型索引,而InnoDB不支持全文索引。
-
MyISAM相对简单,所以在效率上要优于InnoDB,小型应用可以考虑使用MyISAM。
-
MyISAM表是保存成文件的形式,在跨平台的数据转移中使用MyISAM存储会省去不少的麻烦。
-
InnoDB表比MyISAM表更安全,可以在保证数据不会丢失的情况下,切换非事务表到事务表(alter table tablename type=innodb)。
3.数据库优化
(1)根据服务层面:配置mysql性能优化参数;
(2)从系统层面增强mysql的性能:优化数据表结构、字段类型、字段索引、分表,分库、读写分离等等。
(3)从数据库层面增强性能:优化SQL语句,合理使用字段索引。
(4)从代码层面增强性能:使用缓存和NoSQL数据库方式存储,如MongoDB/Memcached/Redis来缓解高并发下数据库查询的压力。
(5)减少数据库操作次数,尽量使用数据库访问驱动的批处理方法。
(6)不常使用的数据迁移备份,避免每次都在海量数据中去检索。
(7)提升数据库服务器硬件配置,或者搭建数据库集群。
(8)编程手段防止SQL注入:使用JDBC PreparedStatement按位插入或查询;正则表达式过滤(非法字符串过滤)
sql语句优化
4.数据库事务
-
事务:是一系列的数据库操作,是数据库应用的基本逻辑单位。
-
四大特性:原子性、一致性、隔离性、持久性
5.存储过程
什么是存储过程?用什么来调用?
存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。 如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。
调用:
可以用一个命令对象来调用存储过程。可以供外部程序调用,比如:java程序。
存储过程的优缺点?
优点:
存储过程是预编译过的,执行效率高。存储过程的代码直接存放于数据库中,通过存储过程名直接调用,减少网络通讯。安全性高,执行存储过程需要有一定权限的用户。存储过程可以重复使用,可减少数据库开发人员的工作量。 缺点:移植性差
1 //创建存储过程 CREATE PROCEDURE userData( IN id INT ) BEGIN SELECT * from userdata WHERE userflag = id; END; 其中IN是传进去的变量; drop procedure userData;//销毁这个存储过程 call userData(2) //调用存储过程
6.DDL和DML
DDL (Data Definition Language 数据定义语言)
create table 创建表 alter table 修改表 drop table 删除表 truncate table 删除表中所有行 create index 创建索引 drop index 删除索引 当执行DDL语句时,在每一条语句前后,oracle都将提交当前的事务。如果用户使用insert命令将记录插入到数据库后,执行了一条DDL语句(如create table),此时来自insert命令的数据将被提交到数据库。当DDL语句执行完成时,DDL语句会被自动提交,不能回滚。
DML (Data Manipulation Language 数据操作语言)
insert 将记录插入到数据库 update 修改数据库的记录 delete 删除数据库的记录 当执行DML命令如果没
有提交,将不会被其他会话看到。除非在DML命令之后执行了DDL命令或DCL命令,或用户退出会话,或终止实例,此时系统会自动发出commit命令,使未提交的DML命令提交。
7.内连接、左外连接和右外连接的区别?
-
左连接:左边有的,右边没有的为null
-
右连接:左边没有的,右边有的为null
-
内连接:显示左边右边共有的
-
全连接:左连接和右连接的并集
8.数据库的三大范式?
-
第一范式
数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。(保持数据的原子性)
-
第二范式
在满足第一范式的基础上,实体的每个非主键属性完全函数依赖于主键属性(消除部分依赖)
-
第三范式
在满足第二范式的基础上,在实体中不存在非主键属性传递函数依赖于主键属性。(表中字段[非主键]不存在对主键的传递依赖)
9.防止sql注入的方法?
-
把应用服务器的数据库权限降至最低
-
(简单又有效的方法)PreparedStatement
采用预编译语句集,它内置了处理SQL注入的能力,只要使用它的setXXX方法传值即可。 使用好处: (1).代码的可读性和可维护性. (2).PreparedStatement尽最大可能提高性能. (3).最重要的一点是极大地提高了安全性. 原理: sql注入只对sql语句的准备(编译)过程有破坏作用 而PreparedStatement已经准备好了,执行阶段只是把输入串作为数据处理, 而不再对sql语句进行解析,准备,因此也就避免了sql注入问题.-
使用正则表达式过滤传入的参数
-
字符串过滤
-
对进入数据库的特殊字符进行转义处理
-
JSP页面判断代码
-
使用专门的SQL 注入检测工具测试,如sqlmap、SQLninja等

浙公网安备 33010602011771号