数据库设计,可以使数据库通过健壮的数据库结构高效并且健康的进行工作。
数据库设计原则:1、熟悉需求。2、开发符合规范的数据库。3、审核数据库设计。
数据库规范
1、命名规范:1、表名的单数和复数形式要统一。2、对于字段,如果主键是数字类型的,可以考虑使用_N结尾,例如USERID_N;如果是字符类型_C结尾USERNAME_C;3、如果一个单词经常出现,比如USER,则可以考虑以_U结尾,例如,USERID可以表示成ID_U,USERNAME表示为NAME_U。4、如果某一列是日期类型,则使用D_开头,起到强调的作用,例如:D_CREATEDATETIME。
2、明确现实中实体与数据表的关系。3、一张数据表不能既没有主键也没有外键。4、表要符合基本表的特征。
5、必须满足第一第二范式,尽量满足第三范式。6、比较简洁的E-R图。7、符合完整性约束。
基本表的特征:1、原子性,就是基本表中的字段是不可在分解的。2、原始性,基本表中的记录是袁术数据的记录。3、演绎性,由基本表和关系表中的数据可以派生出任何想要的数据。4、稳定性、基本表中的结构是相对稳定的,表中的记录需要长期保存。
第一范式:是对属性的原子性约束,要求属性具有原子性,不可再分。第二范式:记录的唯一性约束,要求记录有唯一标识,即实体的唯一性。第三范式:对字段冗余的约束,即任何字段不能由其他字段派生出来,要求字段没有冗余,一个表中的字段除了和主键有关外,这些字段他们之间不能有关系,也就是说这个表中的字段只能和主键相关,他们之间没有关系。
数据库设计技巧:1、在符合系统需求的前提下,表的个数越少越好,一张表中组合主键字段数越少越好,一个表中的字段越少越好。2、检查各种变化字段。3、避免使用保留字。4、数据库设计的时候多使用删除标记字段。5、避免使用触发器。6、如果发现在重复输入数据,就需要创建新的表和新的关系。7、熟练使用数据库设计工具。8、创建E-R图和数据字典。9、每个表都应该有三个有用的字段:修改记录时间、修改人、修改后的版本。10、对于地址和电话采用多个字段。
SQL查询优化
劣质SQL判断条件:1、运行时间超长。2、引发严重的等待事件。3、不能满足压力测试。4、消耗大量系统资源。
索引是对数据库表中一列或者多列的值进行排序的一种结构。使用索引可以快速访问数据库表中的特定信息。
索引存在的问题:1、索引占用表空间,创建太多索引可能会造成索引冗余。2、索引影响DML性能。
索引使用的条件:1、一个字段里包含大量的值。2、一个字段包含多个空值。3、多个字段经常出现在where查询中。4、表非常大并且查询返回数据量低于总数据的20%。
创建索引的语法:
CREATE INDEX 索引名 ON 表名(列名)
TABLESPACE 表空间名
例如:
Select identity_L from depositor where identity_L between
109000 and 110000 --未使用索引,查询值在109000到110000之间的值
CREATE INDEX DPTOR_INDEX ON DEPOSITOR(IDENTITY_L)
TABLESPACE DEMO --使用索引查询。
索引类型,按列值是否唯一分为:非唯一索引和唯一索引。按索引列的个数分为单列索引和复合索引。按照索引的物理组织方式分为:B树索引、反向键索引、基于函数的索引、位图索引。
创建复合索引时,表指定的第一个列为主导列。
select *from depositor t where IDENTITY_L>100000 AND ACT>=500 --未使用索引
create index OP_IDACT_INDEX on DEPOSITOR(IDENTITY_L,ACT) tablespace DEMO --使用复合索引
使用复合索引的情况:1、当SQL语句的WHERE自居中用到复合索引的主导列时。2、当某几个列在SQL语句的WHERE子句中经常通过and操作符联合在一起使用,并且这些列合在一起是选择性比各自单个列的选择性要好时。
3、当有几个查询语句都是查询相同的几个列值时。
反向键索引就是将当前列中的值反转后生成的索引。
创建反向键索引的语法:create index索引名 on 表名(列名) reverse tablespace表空间;
基于函数的索引,基于一个或者多个列上的函数或表达式创建的索引。
注意:表达式中不能包含聚合函数(SUM、COUNT、AVG、MIN、MAX)。
基于函数索引的语法:CREATE INDEX索引名 ON 表名(函数(列名)) TABLESPACE表空间;
select lower(firstname) from depositor t; --没有使用基于函数索引的情况。
create index firstname_lower on depositor(lower(firstname)) tablespace prd;
使用基于函数的索引的情况:1、一个表中的字段经常被函数所调用,那么这个字段就可以使用基于函数的索引。
位图索引:
| 值\行 |
1 |
2 |
3 |
4 |
| 张三 |
1 |
0 |
0 |
1 |
| 李四 |
0 |
0 |
0 |
1 |
| 王五 |
0 |
1 |
0 |
1 |
| 小明 |
1 |
0 |
1 |
1 |
整个表就是针对一个列建立出来的位图索引,这个表中的列(1,2,3,4)表示的是对应的索引列的第几行。行代表的是当前行,当前被索引列的值。比如图中第一列1,张三第一列的值是1,表示在当前被索引的第一行的位置中张三这个值时存在的,并且是1。
使用位图索引的情况:主要是处理数据的聚合关系的,用于一个重复数据很多的情况。
位图索引的语法:
CREATE BITMAP INDEX 索引名 ON 表名(列名) TABLESPACE 表空间; select count(*) from depositor t where firstname=’Luke’;
create bitmap index fn_bitmap on depositor(firstname) tablespace prd;
表分区:有利于管理非常大的表和索引。当表里面的内容或者整个表的结构非常庞大的时候,就考虑表分区。
表分区的优点:1、提高数据的可用性,当某个分区损坏不会影响整个表结构。2、减少管理负担。3、改善语句性能。
表分区的分区方式:1、区间分区。2、散列分区。3、列表分区。4、组合分区。
区间分区:往往根据一个列值的范围来划分,开发中常常使用日期字段来划分。
语法:
PARTITIONBY RANGE(列名) --RANGE表示分区的方式
(
PARTITION 分区表名 VALUES LESS THAN (值)
tablespace 表空间
)
示例:PART_1这个分区保存早于(不包括)2008年12月31日的数据
create table drawlist( dt_draw date not null)
PARTITIONBY RANGE(dt_draw)
(
PARTITION PART_1 VALUES LESSTHAN(to_date(‘1/1/2009’,’dd/mm/yyyy’))
tablespace DEMO,
PARTITION PART_1 VALUES LESSTHAN(to_date(‘1/1/2011’,’dd/mm/yy