• 微信公众号:美女很有趣。 工作之余,放松一下,关注即送10G+美女照片!

面试题系列四:数据库(必问)

开发技术 开发技术 3天前 5次浏览

1.索引

1.1 使用场景?

1.2 索引分类?

MySQL索引包括普通索引、唯一索引、全文索引、单列索引、多列索引、空间索引

1.3 索引作用和优缺点?

索引就一种特殊的查询表,数据库的搜索可以利用它加速对数据的检索。

它很类似与现实生活中书的目录,不需要查询整本书内容就可以找到想要的数据。

索引可以是唯一的,创建索引允许指定单个列或者是多个列。

缺点是它减慢了数据录入的速度,同时也增加了数据库的尺寸大小

1.4 索引不会命中?

1.5主键和唯一索引?

2.两种存储引擎

  1. MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。如果应用中需要执行大量的SELECT查询,那么MyISAM是更好的选择。
  2. 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. 存储过程是预编译过的,执行效率高。
  2. ​存储过程的代码直接存放于数据库中,通过存储过程名直接调用,减少网络通讯。
  3. ​安全性高,执行存储过程需要有一定权限的用户。
  4. ​存储过程可以重复使用,可减少数据库开发人员的工作量。 ​ 缺点:移植性差
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注入的方法?

  1. 把应用服务器的数据库权限降至最低

  2. (简单又有效的方法)PreparedStatement

  3. 采用预编译语句集,它内置了处理SQL注入的能力,只要使用它的setXXX方法传值即可。 ​ 使用好处: ​ (1).代码的可读性和可维护性. ​ (2).PreparedStatement尽最大可能提高性能. ​ (3).最重要的一点是极大地提高了安全性. ​ 原理: ​ sql注入只对sql语句的准备(编译)过程有破坏作用 ​ 而PreparedStatement已经准备好了,执行阶段只是把输入串作为数据处理, ​ 而不再对sql语句进行解析,准备,因此也就避免了sql注入问题.
  4. 使用正则表达式过滤传入的参数

  5. 字符串过滤

  6. 对进入数据库的特殊字符进行转义处理

  7. JSP页面判断代码

  8. 使用专门的SQL 注入检测工具测试,如sqlmap、SQLninja等


程序员灯塔
转载请注明原文链接:面试题系列四:数据库(必问)
喜欢 (0)