数据库&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)构成。

数据库MYSQLHadoopJDBC - Garfield - 张广辉的博客
 
2,数据模型
是用来抽象、表示和处理现实世界中的数据和信息的工具,是对现实世界的模拟,是数据库系统的核心和基础;
1)数据模型的组成要素是:数据结构、数据操作、完整性约束条件
2)分类:概念模型:也称信息模型,是按用户的观点来对数据和信息建模,主要用于数据库设计;逻辑模型:是按计算机系统的观点对数据建模,用于DBMS实现;物理模型:是对数据最底层的抽象,描述数据在系统内部的表示方式和存取方法,在磁盘或磁带上的存储方式和存取方法,是面向计算机系统的。
3)常见的数据模型包括:关系、层次、网状、面向对象、对象关系映射等几种。



4, 阐述数据库三级模式、二级映象的含义及作用。
        数据库三级模式反映的是数据的三个抽象层次: 模式是对数据库中全体数据的逻辑结构和特征的描述。内模式又称为存储模式,是对数据库物理结构和存储方式的描述。外模式又称为子模式或用户模式,是对特定数据库用户相关的局部数据的逻辑结构和特征的描述

        数据库三级模式通过二级映象在 DBMS 内部实现这三个抽象层次的联系和转换。外模式面向应用程序, 通过外模式/模式映象与逻辑模式建立联系, 实现数据的逻辑独立性。 模式/内模式映象建立模式与内模式之间的一对一映射, 实现数据的物理独立性。

数据库MYSQLHadoopJDBC - Garfield - 张广辉的博客

第二章:关系模型
1,实体
1)实体和属性:客观存在并可相互区别的事物称为实体。实体所具有的某一特性称为属性。
数据库MYSQLHadoopJDBC - Garfield - 张广辉的博客
 2)E-R图:即实体-关系图,用于描述现实世界的事物及其相互关系,是数据库概念模型设计的主要工具。
3)实体型之间的关系分为一对一、一对多多对多三种类型。

2,关系模型的组成要素:数据结构:关系为表,元组为行,属性为列,;数据操作:增删改查;完整性约束:实体完整性、参照完整性和用户定义完整性

3,主键: 能够唯一地标识一个元组的属性或属性组称为关系的键或候选键。 若一个关系有多个候选则可选其一作为主(Primary key)。

       :如果一个关系的一个或一组属性引用(参照)了另一个关系的,则称这个或这组属性为外码或外键(Foreign key)。

4,完整性约束

1)实体完整性:用于标识实体的唯一性。它要求基本关系必须要有一个能够标识元组唯一性的主键,主键不能为空,也不可取重复值。【主键唯一且非空

 2)参照完整性: 用于维护实体之间的引用关系。 它要求一个关系的外键要么为空, 要么取与被参照关系对应的主键值,即外键值必须是主键中已存在的值。【外键值为空或被参照关系对应的主键值

 3)用户定义的完整性:就是针对某一具体应用的数据必须满足的语义约束。包括非空、 唯一和布尔条件约束三种情况。


5,关系的 5 种基本操作是选择、投影、并、差、笛卡尔积。

1)笛卡尔积:

将两个表中的各个元组两两组合,列数变为原来的列数之和,行数为原来行数之积;会产生很多无意义的元组

2)投影

取出一个表中的某几列,并去除重复的行或列;属性可能减少,元组可能减少。

3)选择

水平分割,选取符合条件的元组。

6,连接(join)

1)内联接(典型的联接运算,使用像 =  或 <> 之类的比较运算符)。包括条件联接和自然联接。也可以用where....from 表示

条件连接(包括等值连接):先对两个关系进行笛卡尔积运算,再根据条件做选择运算。

自然连接:当两个关系具有公共的属性时,连接条件是两个相同属性组的分量相等,并且把重复的属性去掉(与其他连接的不同)。即先等值连接,在做投影。

数据库MYSQLHadoopJDBC - Garfield - 张广辉的博客

 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与Oracle区别
这两种都是跨平台的
1.  Oracle是大型数据库而Mysql是中小型数据库,Oracle市场占有率达40%,Mysql只有20%左右,同时Mysql是免费开源的而Oracle价格非常高。
2. Oracle支持大并发,大访问量,可靠性高,是联机事务处理系统(OLTP)最好的工具。
3. 安装所用的空间差别也是很大的,Mysql安装完后才152M而Oracle有3G左右,且使用的时候Oracle占用特别大的内存空间和其他机器性能。
4.Oracle和Mysql操作上的一些区别
①主键
Mysql一般使用自动增长类型,在创建表时只要指定表的主键为auto increment,插入记录时,不需要再指定该记录的主键值,Mysql将自动增长;Oracle没有自动增长类型,主键一般使用的序列,插入记录时将序列号的下一个值付给该字段即可;只是ORM框架是只要是native主键生成策略即可。
②单引号的处理
MYSQL里可以用双引号包起字符串,ORACLE里只可以用单引号包起字符串。在插入和修改字符串前必须做单引号的替换:把所有出现的一个单引号替换成两个单引号。
③翻页的SQL语句的处理
MYSQL处理翻页的SQL语句比较简单,用LIMIT 开始位置, 记录个数;ORACLE处理翻页的SQL语句就比较繁琐了。每个结果集只有一个ROWNUM字段标明它的位置, 并且只能用ROWNUM<100, 不能用ROWNUM>80
④ 长字符串的处理
长字符串的处理ORACLE也有它特殊的地方。INSERT和UPDATE时最大可操作的字符串长度小于等于4000个单字节, 如果要插入更长的字符串, 请考虑字段用CLOB类型,方法借用ORACLE里自带的DBMS_LOB程序包。插入修改记录前一定要做进行非空和长度判断,不能为空的字段值和超出长度字段值都应该提出警告,返回上次操作。
⑤空字符的处理
MYSQL的非空字段也有空的内容,ORACLE里定义了非空字段就不容许有空的内容。按MYSQL的NOT NULL来定义ORACLE表结构, 导数据的时候会产生错误。因此导数据时要对空字符进行判断,如果为NULL或空字符,需要把它改成一个空格的字符串。
⑥字符串的模糊比较
MYSQL里用 字段名 like '%字符串%',ORACLE里也可以用 字段名 like '%字符串%' 但这种方法不能使用索引, 速度不快。
⑦Oracle实现了ANSII SQL中大部分功能,如,事务的隔离级别、传播特性等而Mysql在这方面还是比较的弱






二、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条件

  1. mysql> select * from table1 inner join table2; 
  2. mysql> select * from table1 nature join table2;
  3. mysql> select * from table1,table2;
  4. mysql> select * from table1 cross join table2;  
  5. mysql> select * from (table1, table2);  

自然连接:下面两句等价,公共字段只显示一次。

  1. mysql> select * from table1 natural join table2;  
  2. 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)视图:查询结果组成的虚拟表,本身没有内容,内容随相关表而变化。每次用到视图时都需要执行查询效率不高。
create view 视图 as select ......;
16) 存储过程,sql中的封装函数,有in和out两种参数,表示输入和输出。要取得out参数的值需要对out参数执行select。
http://www.jb51.net/article/30825.htm
17)游标:用在存储过程中,取得select结果集中的数据,通过循环遍历对游标中的数据进行操作。
http://www.cnblogs.com/trying/p/3296793.html
18)触发器:create triger。在某个操作的前后执行某些操作。
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树结构:其实就是一个平衡的排序多叉树,高度较小,但增删后的维护比较困难。
数据库MYSQLJDBC - Garfield - 张广辉的博客
由于在修改一棵B树时,需要多次访问硬盘,效率低下,现在有些Nosql数据库采用LSM树。对该树进行写操作时,先在内存中生成一个子树,对子树进行操作,操作完成后在访问硬盘,与原树合并,提高了修改速度。
 
优点:提高检索速度,排序速度,分组速度;缺点:增删改表中数据需要修改索引(可以先删除表中的索引在进行增删数据),占用额外的物理空间。
分为普通索引(可重复),唯一性索引(主键是一种),全文索引,单列索引,多列索引,空间索引。

创建索引:
建表时创建:
已存在表直接创建:
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,基础代码(写完善)(重要
数据库MYSQLHadoopJDBC - Garfield - 张广辉的博客
 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)事务处理优化

        读写分离;减小所粒度;降低隔离级别;使用乐观锁;死锁定期检测


3,大型网站中的数据库
单机------读写分离(两台机)------垂直分割,水平分割(集群)
1)问题:垂直拆分:打破了单机事物;多机join困难;外键约束困难
水平拆分:单机事物;多机join;外键;自增ID受影响;单表查询需要跨数据库。
2)解决分布式事务问题:用两阶段提交来实现
数据库MYSQLJDBC - Garfield - 张广辉的博客
 任何一个资源失败,所有资源进行回滚。
关于CAP与放松事务一致性问题,详见hadoop的nosql

3)解决单库中自增ID问题:UUID可以解决id的唯一性,但是连续性不好;使用独立的ID生成器,每次向生成器取一段ID。生成器在底层存储当前ID序列的最大值,并采取并发控制。
4)解决跨库join:在应用程序中发起多次查询,分解join;数据冗余操作,就是将经常需要join的数据单独建表;搜索引擎方案;
5)合并查询一个逻辑表的问题(水平分割):
单表的分库分表,哈希算法实现。
数据库MYSQLJDBC - Garfield - 张广辉的博客
解决方法是对多个数据源的结果进行合并即可,但是当需要对结果进行分页和排序时,就比较复杂。
比如要求记录按id排序,每页4条记录,此时有两个数据源各自已经排好序。当我们需要查看第一页时,需要从每个数据源中各取出4条记录,进行排序后丢掉四条没用的记录,这样才能保证第一页是最小的4条记录
0 0
原创粉丝点击