2015暑假复习——数据库

1、数据库不满足隔离性,会发生脏数据、不可重复读、幻读等情况。

脏数据:事务A在修改过程中发生了回滚,事务B读到了修改之后的数据,这个数据是无效的;

不可重复读:事务A修改数据的过程中,事务B读取了一批数据;A修改之后B再去读,发现结果跟之前的不一致;

幻读:事务A在添加过程中发生了回滚,事务B读到了添加之后的数据,是数据库中不存在的。

2、游标

游标(cursor)是得到一组数据结果之后用来单行访问数据集的指针。

3、java读取数据库的getObject和getString方法

getObject是一次性获取所有数据,getString是一次一行。针对内存和网络情况选择相应的方法。

4、范式

范式是设计数据库表结构时建议满足的一些要求。从低到高依次有第一范式,第二范式,第三范式,BCNF范式,第四范式。大概了解了前三个。

第一范式是说表的每一列都不可再分,例如电话号码,可以有固定电话和移动电话,这个设计就是不符合第一范式的。数据库使用的时候都能够满足第一范式,设计不出不符合第一范式的表。

第二范式是说表中需要有主键,可以是单独主键,也可以是组合主键,如果是组合主键,不能有部分依赖,例如一个成绩表,主键是学号和课程号,有一个字段是学生年龄,这个字段部分依赖与学号,因此这个设计不符合第二范式。不符合第二范式会造成数据库的数据冗余。

第三范式是说表中不能够有传递依赖与主键。例如主键学号决定了一个班级,班级决定了任课教师,任课教师就是传递依赖与学号的,这样在修改的时候就需要很多冗余操作。

后面几个范式有待于进一步学习。。。。。。

5、索引

索引是提高数据库查询的一种有效方法,当然提高查询的代价是需要维护一个索引表结构,数据库在做增删改操作的时候,索引表结构也要相应的修改,所以索引不是越多越好。

常见的索引有B+树索引,hash索引,顾名思义,索引结构分别为B+树和hash表。B+树比较好理解,指针域、叶子节点存放数据;hash表可以在常数时间查询某一个数据(理想情况下,没有冲突),但是hash表的问题就在于不能够用于查询连续数据集,而B+树很擅长于此;hash不能做局部查询,如like ‘%sql%’,因为hash映射之后的结果不再是类似的内容;hash不能做排序;如果是组合的hash索引,必须在一起查询;(关于hash索引和B+树索引未完待续

组合索引的话,有一个名词叫做最左前缀,意思是以左侧的字段为索引基准,在此基础上再构造子域的索引。以最左前缀查询时能够提高索引效率,而以右侧字段查询时,是不会走索引的。所以最左前缀要选择查询频率较高的、字段内容较丰富的、修改较少的,这通常会存在矛盾,所以需要平衡几个条件,选择最优最左前缀。

如果索引列允许为null,则如果where查询中存在is null的话,执行计划会走全表查询,因为null是不定状态,null和null也是不等的,所以要尽量避免在索引列上允许为null;

聚集索引——物理结构与索引结构一致,通常索引子节点上直接存储数据;非聚集索引——不一致。主键、经常批量查询、不经常修改的字段通常设置成聚集索引。

6、几种数据库的比较

oracle是最古老的一种数据库,传统行业如金融等都用的这个,安全性比较高,性能也好;Mysql是2000年左右才开始出现的,开源,比较适合轻量级网站开发,刚开始默认引擎是MyISAM,不支持事务,后来改成InnoDB,才开始支持事务,Mysql对一些不常用的sql语句也不支持,例如check,会编译,但不会在运行时检查;sqlserver是微软搞得,封闭,跟windows,vs兼容较好,一些中小企业常用。

mysql两种存储引擎的区别,MyISAM默认不支持事务,InnoDB支持事务;MyISAM需要较少的内存和磁盘空间,InnoDB因为要支持事务所以需求较大;

7、优化查询的几种方法

1)用临时表,把查询结果缓存在数据库中;

2)使用相同的sql语句,因为之前已经在数据库中编译过了;

3)使用索引;

4)尽量不用like '%sql%'的形式,这样的模糊查询会不走索引;

5)用where语句尽可能的筛除数据,然后再执行聚集函数(groupby,having);

6)只查询需要的字段;

7)如果知道查询的条数,用limit限制;

8)对于链表查询join,尽可能在两个join的字段上加索引,这样两个字段就是有序的,不需要做笛卡尔积;

8、执行计划的执行顺序

where>group by>having>order by




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章