数据库

来源:互联网 发布:linux查看剩余磁盘空间 编辑:程序博客网 时间:2024/06/03 16:38

1.数据库事务是什么?有什么特性?

    数据库事务是指作为单个逻辑工作单元执行的一系列的操作,这些操作要么全做、要么全不做,是一个不可分割的工作单位。

  数据库事务的四大特性(简称ACID)是:

   (1)原子性(Atomicity)

  事务的原子性指的是,事务中包含的程序作为数据库的逻辑工作单位,它所做的对数据修改操作要么全部执行,要么完全不执行。这种特性称为原子性。

 例如:银行取款事务分为两个步骤:①存折减款②提取现金。不可能存折减款,却没有提取现金。两个步骤必须同时完成或都不完成。

  (2)一致性(Consistency)

  事务的一致性指的是在一个事务执行之前和执行之后数据库都必须处于一致性状态。这种特性称为一致性。假如数据库的状态满足所有的完整性约束,那么就说该数据库是一致的。

  例如完整性约束a+b=10,一个事务改变了a,那么b也随之改变。

  (3)分离性(Isolation)

  分离性指的是并发的事务是相互隔离的。即一个事务内部的操作及正在操作的数据必须封锁起来,不被其他企图进行修改的事务看到。假如并发交叉执行的事务没有任何控制,操纵相同的共享对象的多个并发事务的执行可能引起异常情况。

  (4)持久性(Durability)

  持久性意味着当系统或介质发生故障时,确保已提交事务的更新不能丢失。即一旦一个事物提交,DBMS保证它对数据库中数据的改变应该是永久性的,即对已提交的事务的更新能恢复。持久性通过数据库备份和恢复来保证。

2.索引是什么?优缺点?

  索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。

  索引的类型:一种是数据表的物理顺序与索引顺序相同的聚簇索引;另一种是数据表的物理顺序与索引顺序不相同的非聚簇索引。

  优点:

  1)通过创建唯一性索引,可以保证数据库表中的每一行数据的唯一性。

  2)可以大大加快数据的检索速度,这是创建索引的最主要的原因。

  3)可以加速表和表之间的连接,特别是在实现数据的参考完整性方面有特别的意义。

  4)在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。

  5)通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

  缺点:

  1)创建索引和维护索引需要耗费时间,这种时间随着数据量的增加而增加。

  2)索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。

  3)当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。

  不应该创建索引的这些列具有下列特点:

  1)对于那些在查询中很少使用或者参考的列不应该创建索引。

  2)对于那些只有很少数据值的列也不应该增加索引。

  3)对于那些定义为text,image数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。

  4)当修改性能远大于检索性能时,不应该创建索引。

  3.怎么优化数据库 

  1.利用表分区

  分区将数据在物理上分隔开,不同分区的数据可以制定保存在处于不同磁盘上的数据文件里。这样,当对这个表进行查询时,只需要在表分区中进行扫描,而不必进行全表扫描,明显缩短了查询时间。

  2.别名的使用

  别名是大型数据库的应用技巧,就是表名、列名在查询中以一个字母为别名,查询速度要比建连接表快1.5倍。

  3.索引index的优化设计

    索引可以大大加快数据库的查询速度。但是创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。而且索引需要占物理空间,除了数据表占数据空间,每一个索引还要占一定的物理空间。并且索引在创建之后,由于频繁的对数据进行增加、删除、修改等操作使得索引产生碎片。因此,必须对索引进行维护。

4.调整硬盘I/O

  将表和索引分开;

  创造用户表空间,与系统表空间分开磁盘;

  创建表和索引时制定不同的表空间;

5.死锁与阻塞

  对于需要频繁更新的数据,尽量避免放在长事务中,以免导致连锁反应。

  减少事务大小,及时提交事务。

  尽量避免跨数据库的分布式事务,因为环境的复杂性,很容易导致阻塞。

4.三大范式

  1)第一范式(无重复的列)

  所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中某个属性不能有多个值或者不能有重复的属性。如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与元实体之间为一对多关系。在第一范式中表的每一行只包含一个实例的信息。简言之,第一范式就是无重复的列。

  2)第二范式(2NF)属于完全依赖于主键[消除部分子函数依赖]

  如果关系模式R为第一范式,并且R中每一个非主属性完全函数依赖于R的某个候选键,则称为第二范式模式。

  第二范式是在第一范式的基础上建立起来的,即满足第二范式必须先满足第一范式。第二范式要求数据表中的每个实例或行必须可以被唯一的区分。为实现区分通常需要为表加上一列,以存储各个实例的唯一标识。这个唯一属性列被称为主关键字或主键、主码。

  完全依赖是指不能存在仅依赖主关键字一部分的属性(设有函数依赖W→A,若存在XW,有X→A成立,那么称W→A是局部依赖,否则就称W→A是完全函数依赖。)

  3)第三范式(3NF)属性不依赖与其他非主属性[消除传递依赖]

  如果关系模式R是第二范式,且每个非主属性都不传递依赖于R的候选键,则R称为第三范式模式。

  满足第三范式必须先满足第二范式。第三范式要求一个数据库表中不包含已在其他表中已包含的非主关键字信息。

  在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。简言之,第三范式就是属性不依赖其他非主属性。

  所谓传递函数依赖,指的是如果“A→B→C”的决定关系,则C传递函数依赖与A。因此,满足第三范式的数据表中不应该存在如下依赖关系:

  关键字段→非关键字段X→非关键字段Y

5.sql注入原理是什么?

  定义:所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。

  主要原因: 动态生成SQL语句时没有对用户输入的数据进行验证。

  SQL注入的原理:攻击者通过Web应用程序利用SQL语句或字符串将非法的数据插入到服务器端数据库中,获取数据库的管理用户权限,然后将数据库管理用户权限提升至操作系统管理用户权限,控制服务器操作系统,获取重要信息及机密文件。

6.如何检测SQL注入?

SQL注入漏洞攻击检测分为入侵前的检测和入侵后的检测。入侵前的检测,可以通过手工方式,也可以使用SQL注入漏洞扫描工具软件。检测的目的是为预防SQL注入漏洞攻击,而对于SQL注入漏洞攻击后的检测,主要是针对审计日志的查看,SQL注入漏洞攻击成功后,会在Web Service和数据库的审计日志中留下“痕迹”。  

(1)动态SQL检查  

动态的SQL语句是一个进行数据库查询的强大的工具,但把它和用户输入混合在一起就使SQL注入成为了可能。将动态的SQL语句替换成预编译的SQL或者存储过程对大多数应用程序是可行的。预编译的SQL或者存储过程可以将用户的输入作为参数而不是命令来执行,这样就限制了入侵者的行动。当然,它不适用于存储过程中利用用户输入来生成SQL命令的情况。在这种情况下,用户输入的SQL命令仍可能得到执行,数据库仍然存在SQL注入漏洞攻击的危险。  

(2)有效性校验  

如果一个输入框只可能包括数字,那么要通过验证确保用户输入的都是数字。如果可以接受字母,检查是不是存在不可接受的字符,那就需要设置字符串检查功能。确保应用程序要检查以下字符:分号、等号、破折号、括号以及SQL关键字。  

(3)数据表检查  

使用SQL注入漏洞攻击工具软件进行SQL注入漏洞攻击后,都会在数据库中生成一些临时表。通过查看数据库中最近新建的表的结构和内容,可以判断是否曾经发生过SQL注入漏洞攻击。 

(4)审计日志检查  

在Web服务器中如果启用了审计日志功能,则Web Service审计日志会记录访问者的IP地址、访问时间、访问文件等信息,SQL注入漏洞攻击往往会大量访问某一个页面文件(存在SQL注入点的动态网页),审计日志文件会急剧增加,通过查看审计日志文件的大小以及审计日志文件中的内容,可以判断是否发生过SQL注入漏洞攻击事件;另外还可以通过查看数据库审计日志,查询某个时间段是否有非法的插入、修改、删除操作。  

(5)其他  

SQL注入漏洞攻击成功后,入侵者往往会添加特权用户(如:administrator、root、sa等)、开放非法的远程服务以及安装木马后门程序等,可以通过查看用户帐户列表、远程服务开启情况、系统最近日期产生的一些文件等信息来判断是否发生过入侵。  

7.MySQL中存储引擎及区别 

 1. 存储引擎:就是如何实现存储数据,如何为存储的数据建立索引以及如何更新、查询数据等技术实现的方法。

  2.MySQL中查看引擎

   (1)show engines;//查看mysql所支持的存储引擎,以及从中得到mysql默认的存储引擎

   (2)show variables like '%storage_engine'; //查看mysql默认的存储引擎

   (3)show table status from database where name="tablename" //准确查看某个数据库中的某个表所使用的存储引擎

  3.MySQL中常用的几种存储引擎:innoDB、memory、myisam

  innoDB存储引擎:

  (1)innoDB存储引擎该mysql表提供了事务,回滚以及系统崩溃修复能力和多版本并发控制的事务的安全。

  (2)innoDB支持自增长列,自增长列的值不能为空。

  (3)innoDB存储引擎支持外间,外检所在的表称为子表而所依赖的表为父表。

  (4)innoDB存储引擎最重要的是支持事务、以及事务相关联功能。

  Myisam存储引擎:

  (1)这种存储引擎不支持事务,不支持行级锁,只支持并发插入的表锁,主要用于高负载的select。

  (2)myisam类型的表支持三种不同的存储结构:静态型、动态型、压缩型。

  静态型:就是定义的表列的大小是固定的(即不含有:xblob、xtext、、varchar等长度可变的数据类型),这样mysql就会自动使用静态myisam格式。

    使用静态格式的表的性能比较高,因为在维护和访问的时候以预定格式存储数据时需要的开销很低。

  动态型:如果列(及时只有一列)定义为动态的(xblob、xtext、、varchar等数据类型),这时myisam就自动使用动态性,虽然动态型的表占用了比静态表较少的空间,但带来了性能的降低。因为如果某个字段的内容发生改变则其位置很可能需要移动,这样就会导致碎片的产生。随着数据的增多,碎片也增多,数据访问性能就会相应的降低。

  Memory存储引擎

  (1)memory存储引擎相比前面的一些存储引擎,有点不一样,其使用存储在内从中的数据来创建表,而且所有的数据也都存储在内存中。

  (2)每个基于memory存储引擎的表实际对应一个磁盘文件,该文件的文件名和表名是相同的,类型为.frm。该文件只存储表的结构,而其数据文件,都是存储在内存中的,有利于对数据的快速处理,提高整个表的处理能力。

  (3)memory存储引擎默认使用哈希索引,其速度比使用B-Tree要快。

  4.SQL(多表查询,左连接和右连接的区别) 

    从多个表中查询数据就是多表查询。

  多表查询需要连接多个表,链接可以分为以下几类:

  (1)内连接。(典型的连接运算,使用像 = 或 <>之类的比较运算符)包括相等链接和自然连接。

  内连接使用比较运算符根据每个表共有的列的值匹配两个表中的值。

 (2)外连接。外连接可以是左外连接,右外连接或者完整外部连接。

  在FROM子句中指定外连接时,可以由一下几组关键字中的一组指定:

 ① LEFT JOIN 或 LEFT OUTRT JOIN

  左外连接的结果集包括left outer子句中指定的左表的所有行,而不仅仅是连接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集中右表的所有选择列表均为空值。

 ② RIGHT JOIN 或RIGHT OUTER JOIN

  右外连接是左外连接的反向连接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。

 ③ FULL JOIN 或 FULL OUTER JOIN

  完整外部连接返回左表和右表的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。

  (3)交叉连接。交叉连接返回左表的所有行,左表中的每一行与右表中的所有行组合。也成为笛卡儿积。


  

0 0