数据库&MYSQL&JDBC
来源:互联网 发布:淘宝产品短连接 编辑:程序博客网 时间:2024/06/04 20:20
别人总结的知识点:
http://blog.csdn.net/yangcs2009/article/details/38349289
http://blog.csdn.net/jokes000/article/details/7521259
第一章:概论
1,数据库术语
1. Data:数据,是数据库中存储的基本对象,是描述事物的符号记录。
2. Database:数据库,是长期储存在计算机内、有组织的、可共享的大量数据的集合。
3. DBMS:数据库管理系统,是位于用户与操作系统之间的一层数据管理软件,用于科学地组织、存储和管理数据、高效地获取和维护数据。如mysql,oracle。
4. DBS:数据库系统,指在计算机系统中引入数据库后的系统,一般由数据库、数据库管理系统、应用系统、数据库管理员(DBA)构成。
2,数据模型
数据库三级模式通过二级映象在 DBMS 内部实现这三个抽象层次的联系和转换。外模式面向应用程序, 通过外模式/模式映象与逻辑模式建立联系, 实现数据的逻辑独立性。 模式/内模式映象建立模式与内模式之间的一对一映射, 实现数据的物理独立性。
外键:如果一个关系的一个或一组属性引用(参照)了另一个关系的主键,则称这个或这组属性为外码或外键(Foreign key)。
4,完整性约束
1)实体完整性:用于标识实体的唯一性。它要求基本关系必须要有一个能够标识元组唯一性的主键,主键不能为空,也不可取重复值。【主键唯一且非空】
2)参照完整性: 用于维护实体之间的引用关系。 它要求一个关系的外键要么为空, 要么取与被参照关系对应的主键值,即外键值必须是主键中已存在的值。【外键值为空或被参照关系对应的主键值】
3)用户定义的完整性:就是针对某一具体应用的数据必须满足的语义约束。包括非空、 唯一和布尔条件约束三种情况。
5,关系的 5 种基本操作是选择、投影、并、差、笛卡尔积。
1)笛卡尔积:
将两个表中的各个元组两两组合,列数变为原来的列数之和,行数为原来行数之积;会产生很多无意义的元组
2)投影
取出一个表中的某几列,并去除重复的行或列;属性可能减少,元组可能减少。
3)选择
水平分割,选取符合条件的元组。
6,连接(join)
1)内联接(典型的联接运算,使用像 = 或 <> 之类的比较运算符)。包括条件联接和自然联接。也可以用where....from 表示
条件连接(包括等值连接):先对两个关系进行笛卡尔积运算,再根据条件做选择运算。
自然连接:当两个关系具有公共的属性时,连接条件是两个相同属性组的分量相等,并且把重复的属性去掉(与其他连接的不同)。即先等值连接,在做投影。
2)外连接:
http://blog.csdn.net/hellowheat/article/details/4207467
3)交叉连接:笛卡尔积;所有的连接都是先做笛卡尔积,然后通过条件筛选。
三种连接的区别:内连接通过条件筛选,不符合条件的两个表中的元组都不会显示;外连接也通过条件筛选,如果是左外连接,左表中不符合条件的元组会显示一条记录,配对项中的数据为null。也就是说坐标的任何记录都会在连接表中显示。笛卡尔积完全不考虑条件,左表中的每条元组都要和右表中的元组配一下对。
7,数据库表设计3范式
1NF(First Normal Form):当且仅当所有属性只包含原子值,即每个属性都是不可再分的数据项。如某一属性为联系方式,其中包括联系电话和通讯地址,则就不符合。
2NF(Second Normal Form):当且仅当实体E满足第一范式,且每一个非键属性完全依赖主键时,满足第二范式。即要求数据库表中的每个实例或行必须可以被惟一地区分。
3NF(Third Normal Form):当且仅当实体E是第二范式(2NF),且E中没有非主属性传递依赖时,满足第三范式。例如,存在一个部门信息表,其中每个部门有部门编号(dept_id)、部门名称、部门简介等信息。那么在员工信息表中列出部门编号后就不能再将部门名称、部门简介等与部门有关的信息再加入员工信息表中。员工编号---部门编号---(部门名称、部门简介),这就叫传递依赖。如果不存在部门信息表,则根据第三范式(3NF)也应该构建它,否则就会有大量的数据冗余。
第三章:安全与性能
1,数据库并发控制
事务是一组数据库操作序列,这些操作不可分割,要么全做,要么不做,是数据库的逻辑工作单位,相当于操作系统进程的概念。
ACID,指数据库事务正确执行的四个基本要素的缩写。包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
其他详见hibernate悲观锁乐观所部分。
2,数据库的索引:
http://blog.csdn.net/pang040328/article/details/4164874
3,常见关系型数据库
小型数据库:access、foxbase;中型数据库:sql server 、mysql、informix;大型数据库:db2、Oracle、Sybase。
二、Mysql数据库
1)distinct:去除重复的行;当distinct用于检索多个属性时只能这样用, 如select distinct row1,row2 from table;这样的话会搜索出row1和row2均不相同的行。
2)limit 1,2 选取第二行和第三行;
3)order by 按列排序;order by 和limit组合能找出第n大(小)的值,找不到返回null;
4)where 除了正常关系运算外还可通过is null返回空值的行,多个条件时可以使用and or in连接;
from.... where.....可以和join.....on.....等价转换,大于两个表时建议用第二种。
5)like进行字符串匹配,返回包含目标字串的行,有通配符%(任意多个字符)和_(任意一个字符),使用通配符后效率低下;
6)正则表达式 regexp。关于LIKE和REGEXP的区别:LIKE匹配整个列。如果被匹配的文本仅在列值中出现,LIKE并不会找到它,相应的行也不会返回(当然,使用通配符除外)。而REGEXP在列值内进行匹配,如果被匹配的匹配的文本在列值中出现,REGEXP将会找到它,相应的行将被返回,这时一个非常重要的差别(当然,如果适应定位符号^和$,可以实现REGEXP匹配整个列而不是列的子集)。
7)全文本搜索,match和against。效率比前两个高。
8)字符串处理函数;日期处理函数;数字处理函数;
聚集函数:运行在行组上,返回一个值。avg(),count(),max(); 聚集函数只能返回单个值,如果存在多个最大值的情况,则不能用聚集函数。
9)group by(分组) 和 having(过滤分组)
使用group by的两个要素:
(1) 出现在select后面的字段 要么是聚合函数中的,要么是group by 中的.
(2) 要筛选结果 可以先使用where 再用group by 或者先用group by 再用having
http://www.cnblogs.com/rainman/archive/2013/05/01/3053703.html
10)select子句循序:select、from、 where、 group by、 having、 order by、 limit
11)子查询:where子句in操作符中;
12)mysql中的join:
交叉连接:mysql中以下五句等价,前三句都属于内连接,但在普通sql中,内连接必须加on条件
- mysql> select * from table1 inner join table2;
- mysql> select * from table1 nature join table2;
- mysql> select * from table1,table2;
- mysql> select * from table1 cross join table2;
- mysql> select * from (table1, table2);
自然连接:下面两句等价,公共字段只显示一次。
- mysql> select * from table1 natural join table2;
- mysql> select * from table1 inner join table2 using (id);
外连接:外连接相对于内连接的区别在于对于无法匹配的记录外连接会虚拟一条与之匹配的记录来保全连接表中的所有记录。
在使用left jion时,on和where条件的区别如下:
1、 on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
13)表别名:在函数后面加as创建新的列名;
14) sql可能出现null的一些情况:
表定义中某些列定义为null
没有Else的Case语句
左、右和完全外联接
选择Min、Max、Avg和Sum
数学运算涉及可为null的列
15)视图:查询结果组成的虚拟表,本身没有内容,内容随相关表而变化。每次用到视图时都需要执行查询效率不高。19)delete删除重复字段问题 delete a from Person a join Person b on a.email=b.email and a.id>b.id;
20)建表时的引擎:engine=语句。
MyISAM是MySQL的默认存储引擎。MyISAM不支持事务、也不支持外键,但其访问速度快,对事务完整性没有要求。支持全文本 。使用表锁技术优化并发,但高并发下性能较差;
InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是比起MyISAM存储引擎,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。 不支持全文本
MEMORY功能类似MyISAM该存储引擎使用存在内存中的内容来创建表。每个MEMORY表只实际对应一个磁盘文件。MEMORY类型的表访问非常得快,因为它的数据是放在内存中的,并且默认使用HASH索引。但是一旦服务关闭,表中的数据就会丢失掉。
21)索引:类似于字典里的索引,创建索引是指在某张表的一列或者多列上建立一个索引,不使用索引,MySQL必须从第1条记录开始然后读完整个表直到找出相关的行。
有两种数据类型,B型树索引和哈希索引,MyISAM和InnoDB只支持B型树而MEMORY支持两者。
B树结构:其实就是一个平衡的排序多叉树,高度较小,但增删后的维护比较困难。
优点:提高检索速度,排序速度,分组速度;缺点:增删改表中数据需要修改索引(可以先删除表中的索引在进行增删数据),占用额外的物理空间。
分为普通索引(可重复),唯一性索引(主键是一种),全文索引,单列索引,多列索引,空间索引。
创建索引:
建表时创建:
已存在表直接创建:CREATE INDEX index_name ON table_name (column_list)
alter table 创建已存在表索引:alter table table_name ADD INDEX index_name(column_list);
使用索引:使用where过滤行时,所涉及到的列会先检测有没有索引,如果有的话会自动使用加快查询速度。多列索引只适用于索引中的多个列同时被查询到的情况。
MySQL也能利用索引来快速地执行ORDER BY和GROUP BY语句的排序和分组操作。
通过索引优化来实现MySQL的ORDER BY语句优化:
ORDER BY的索引优化。如果一个SQL语句形如:
SELECT [column1],[column2],…. FROM [TABLE] ORDER BY [sort];
在[sort]这个栏位上建立索引就可以实现利用索引进行order by 优化。
三,JDBC
1,基础代码(写完善)(重要)
2,处理DML(重要)
stmt = conn.createStatement();
String sql = "insert into dept2 values (98, 'GAME', 'BJ')";
stmt.executeUpdate(sql);
3,使用preStat(重要)
pstmt = conn.prepareStatement("insert into dept2 values (?, ?, ?)");
pstmt.setInt(1, deptno);
pstmt.setString(2, dname);
pstmt.setString(3, loc);
pstmt.executeUpdate();
4,处理存储过程
CallableStatement cstmt = conn.prepareCall("{call p(?, ?, ?, ?)}");
cstmt.registerOutParameter(3, Types.INTEGER);
cstmt.registerOutParameter(4, Types.INTEGER);
cstmt.setInt(1, 3);
cstmt.setInt(2, 4);
cstmt.setInt(4, 5);
cstmt.execute();
System.out.println(cstmt.getInt(3));
System.out.println(cstmt.getInt(4));
5,批处理
PreparedStatement ps = conn.prepareStatement("insert into dept2 values (?, ?, ?)");
ps.setInt(1, 61);
ps.setString(2, "haha");
ps.setString(3, "bj");
ps.addBatch();
ps.setInt(1, 62);
ps.setString(2, "haha");
ps.setString(3, "bj");
ps.addBatch();
ps.setInt(1, 63);
ps.setString(2, "haha");
ps.setString(3, "bj");
ps.addBatch();
ps.executeBatch();
6,事务处理(重要)
conn.setAutoCommit(false);
stmt = conn.createStatement();
stmt.addBatch("insert into dept2 values (51, '500', 'haha')");
stmt.addBatch("insert into dept2 values (52, '500', 'haha')");
stmt.addBatch("insert into dept2 values (53, '500', 'haha')");
stmt.executeBatch();
conn.commit();
conn.setAutoCommit(true);
7,滚动结果集
ResultSet是一个游标,调用RS的相关函数可使用滚动的结果集。
8,JDBC连接池
1)DriverManager存在的问题:首先,每一次Web请求都要建立一次数据库连接。建立连接是一个费时的活动,每次都得花费0.05s~1s的时间,而且系统还要分配内存资源。对于大型电子商务网站,同时有几百人甚至几千人在线是很正常的事。在这种情况下,频繁的进行数据库连接操作势必占用很多的系统资源,网站的响应速度必定下降,严重的甚至会造成服务器的崩溃。不是危言耸听,这就是制约某些电子商务网站发展的技术瓶颈问题。其次,对于每一次数据库连接,使用完后都得断开。否则,如果程序出现异常而未能关闭,将会导致数据库系统中的内存泄漏,最终将不得不重启数据库。还有,这种开发不能控制被创建的连接对象数,系统资源会被毫无顾及的分配出去,如连接过多,也可能导致内存泄漏,服务器崩溃。
2)连接池概念:对于共享资源,有一个很著名的设计模式:资源池(Resource Pool)。为解决上述问题,可以采用数据库连接池技术。数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。我们可以通过设定连接池最大连接数来防止系统无尽的与数据库连接。更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量﹑使用情况,为系统开发﹑测试及性能调整提供依据。
3)连接池的关键问题:
A、并发问题
public synchronized Connection getConnection()
B、多数据库服务器和多用户
对于大型的企业级应用,常常需要同时连接不同的数据库(如连接Oracle和Sybase)。如何连接不同的数据库呢?我们采用的策略是:设计一个符合单例模式的连接池管理类,在连接池管理类的唯一实例被创建时读取一个配置文件,其中存放数据库连接信息如用户名,密码等,根据文件信息,创建多个连接池类的实例,每一个实例都是一个特定数据库的连接池。连接池管理类实例为每个连接池实例取一个名字,通过不同的名字来管理不同的连接池。
C、事务处理
可采用每一个事务独占一个连接来实现,这种方法可以大大降低事务管理的复杂性。
D、连接池的分配与释放
使用优先级阻塞队列管理空闲连接。
E、连接池的配置与维护
连接池中到底应该放置多少连接,才能使系统的性能最佳?系统可采取设置最小连接数(minConn)和最大连接数(maxConn)来控制连接池中的连接。最小连接数是系统启动时连接池所创建的连接数。如果创建过多,则系统启动就慢,但创建后系统的响应速度会很快;如果创建过少,则系统启动的很快,响应起来却慢。这样,可以在开发时,设置较小的最小连接数,开发起来会快,而在系统实际使用时设置较大的,因为这样对访问客户来说速度会快些。最大连接数是连接池中允许连接的最大数目,具体设置多少,要看系统的访问量,可通过反复测试,找到最佳点。
如何确保连接池中的最小连接数呢?有动态和静态两种策略。动态即每隔一定时间就对连接池进行检测,如果发现连接数量小于最小连接数,则补充相应数量的新连接,以保证连接池的正常运转。静态是发现空闲连接不够时再去检查。
3)JDBC提供javax.sql.DataSource接口用来为所有实现连接池的类提供标准,DataSource只提供了两个getConnection方法,用来替代DriverManager类。
在DataSource实现类的构造函数中批量创建与数据库的连接,并把创建的连接加入LinkedList对象中。实现getConnection方法,让getConnection方法每次调用时,从LinkedList中取一个Connection返回给用户。当用户使用完Connection,调用Connection.close()方法时,Collection对象应保证将自己返回到LinkedList中,而不要把conn还给数据库。
在Spring中就实现了DataSource,叫做dbcp,在配置文件中配置即可使用。
9,Rowset接口
RowSet 是 JDBC 2.0 开始提供的一个扩展包的接口,RowSet 接口扩展了 ResultSet 接口,可以允许我们作很多 ResultSet 不可做的事情。 RowSet 一共有 3 种具体的行集,它们是 CachedRowSet 、 JdbcRowSet 和 WebRowSet 。
区别:
(1)默认情况下,所有 RowSet 对象都是可滚动的和可更新的。而ResultSet是只能向前滚动和只读的。
(2)RowSet可以是非链接的,而ResultSet是连接的。因此利用CacheRowSet接口可以离线操作数据。
(3)RowSet接口添加了对 JavaBeans 组件模型的 JDBC API 支持。rowset 可用作可视化 Bean 开发环境中的 JavaBeans 组件。
(4)RowSet采用了新的连接数据库的方法,。
(5)CacheRowSet是可以序列化的。
(6)应该倾向于把RowSet看成是与数据库无关的东西,它只是一个代表一行行数据的对象,而ResultSet则是一个与数据库紧密联系的东西。
四。数据库调优总结
http://blog.163.com/liang8421@126/blog/static/89481957201071755815308/
1,硬件调优:
1)数据库对象的放置策略 利用数据库分区技术,均匀地把数据分布在系统的磁盘中,平衡I/O 访问,避免I/O 瓶 颈:
2)RAID (独立磁盘冗余阵列)是由多个磁盘驱动器(一个阵列)组成的磁盘系统。通过将磁盘阵列当作一个磁盘来对待,基于硬件的RAID允许用户管理多个磁盘。通过使用基于硬件的RAID, 用户在不关闭系统的情况下能够替换发生故障的驱动器。 并发访问,访问速度比单块磁盘要高,数据可靠性高。
2,软件调优
1)应用程序优化:不访问或少访问数据库;简化对数据库的访问;使访问最优; 建立连接池,让连接尽量得以重用
2)建表优化:遵循建表三范式的同时做一下优化。
a,表分割,以避免取部分数据需要访问整张表。分割表可分为水平分割表和垂直分割表两种;水平分割适用于连接较少的表,垂直分割适用于某些列访问平率过高。
b,存储衍生数据 对一些要做大量重复性计算的过程而言,若重复计算过程得到的结果相同,把结果存放在单独表中,虽然加快了访问速度,但产生了数据冗余,违反了第三范式
3)中间表临时表,采用临时表技术首先需将要操作的数据集插入到临时表中,这会给系统带来额外的开销。所以只有两种情况适用。
a,对数据量较大的表进行连接操作,并且连接操作的结果是一个小结果集。
b,对数据量较大的表进行频繁访问,访问的范围比较固定且比较集中。
4)索引优化
查询多余增删的表使用索引;
索引类别的选择:比如无重复的列选择唯一索引;多列联合查询选择复合索引;
聚蔟与非聚簇选择;
索引中存储值不能为全空;
5)SQL语句优化
a,选择影响较大的语 句放在前面;较弱的选择条件写在后面,这样就可以先根据较严格的条件得出数据较小的信息;
b,不使用子查询而用join
c,字段提取按照“ 需多少,提多少” 的原则,避免“SELECT *”。
d,避免使用!=(或<>)、IS NULL 或IS NOT NULL、IN、NOT IN等这样的操作符,这些操作符会使系统无法使用索引。
6)事务处理优化
读写分离;减小所粒度;降低隔离级别;使用乐观锁;死锁定期检测
- JDBC连接MySQL数据库
- JDBC连接MySQL数据库
- JDBC连接MYSQL数据库
- JDBC连接mysql数据库
- jdbc连接Mysql数据库
- jdbc 连接mysql数据库
- JDBC连接MYSQL数据库
- jdbc操作mysql数据库
- JDBC连接MySql数据库
- jdbc 连接Mysql数据库
- jdbc 操作mysql数据库
- jdbc连MySQL数据库
- JDBC连接MySQL数据库
- JDBC连接MYSQL数据库
- JDBC连接数据库(MySQL)
- JDBC连接mySQL数据库
- jdbc连接Mysql数据库
- jdbc连接mysql数据库
- 并发编程学习
- jsp and servlet
- 常用算法总结
- Spring
- 操作系统
- 数据库&MYSQL&JDBC
- 华为上机题目
- 单元测试与Junit
- vim个人配置记录
- Hadoop基础学习
- IO和NIO
- R类与资源文件说明
- log4j与日志系统
- JavaScript基础学习