数据库设计和使用的一些常用好习惯

好的习惯,需要不断的培养和强化,直到成为一种习惯,然后成为思想的一部分。

    上班前或者下班后,有空我都要给我家小家伙读一读《三字经》或者《弟子规》,他可能并不懂这些文字的内容,但是我希望这些知识能够陪伴他长大,成为思想和行动的一部分。

    我们设计系统架构、做数据库规划的时候,也有一些基本的原则。

不知道没有关系,多学习就知道了

不懂没有关系,多看几次就懂了

持之以恒就是人生。

 

    数据库常用的好习惯记录下来,没事就翻翻。

设计表和索引等

1.   选择合适的小字段,可以减少数据库行数据的大小,并提高索引匹配的效率,进而提升数据库性能。如日期采用date代替datetime、类型或标记使用tinyint代替smallint和int、使用定长字段代替非定长字段(如char代替varchar2),都能或多或少减少数据行大小,提高数据库缓冲池的命中率;

 

2.   主键,其选型更会对表索引的稳定和效率带来很大的影响,一般建议考虑数据库自增或自主维护的唯一数值。

 

3.   适当的冗余一些数据,这样在设计表的时候虽然不舒服,但是可以提高很多性能;

 

4.   如果业务内容比较多,不要把所有字段都放到一个表中,这样表空间会很大,查询速度会很慢,要明确“哪些字段常用,哪些字段不常用”,尽量把不常用的字段放在附表里面,与主表一对一关联。

 

5.   在高分离度字段创建索引,比如用户表中的电话号码字段,索引的效率会非常高;

 

6.   类型,状态等内容基本变化不多的字段,原则上用位图索引比普通索引有效些,但是创建使用位图索引,必须要验证效率是否得到提升;

 

7.  不要太依赖于建索引,一般而言,创建索引会提升相应的查询速度,但是索引太多,会影响输入的写入。

 

使用表的一些习惯

1.  正如我们编写JAVA程序,可以多利用Apache Commons工具包一样,多利用Oracle自带的内部函数不仅可以提升开发效率,也能提高Sql语句执行效率;

 

2.  尽量把sql语句写成 dm=? ,然后再赋值,而不是直接dm=9,这样oracle每次执行都要编译这条语句,而前面的那种方法,oracle只编译一次。

 

3.  Exists比in 的效率大多数时候都会高,具体在选择IN或EXIST操作时,要根据主子表数据量大小来具体考虑。

3.

4.  Not in最好在代码中不要出现,效率不高,如果一定要用,可以用 minus 或则not exists代替。

4.

5.  where条件中,尽量不要用to_char,to_date,upper等方法进行格式转换。转换和计算操作尽量放=右边,如果在左边进行了转换,那么会进行全表扫描;如果索引不是基于函数的,那么当在Where子句中对索引列使用函数时,索引不再起作用。

 

6.  不要把很复杂的逻辑用一条语句来实现,如果这种复杂的语句执行效果不理想,可以尝试把它拆开成简单的语句,看看效率是否提升。

 

7.  尽量不要用“<>”或者“!=”操作符。对不等于操作符的处理会造成全表扫描,可以用“<” or “>”代替。例如:a<>0改为 a>0 or a<0,a<>’’ 改为 a>’ ’,用“>=”替代“>”。

 

8.  Where子句中出现IS NULL或者IS NOT NULL时,Oracle会停止使用索引而执行全表扫描。可以考虑在设计表时,对索引列设置为NOTNULL。这样就可以用其他操作来取代判断NULL的操作。

8.

9.  当通配符“%”或者“_”作为查询字符串的第一个字符时,索引不会被使用,因此一般不要作为第一个字符出现。或者尽可能不用这种方式;

 

10.  对于有连接的列“||”,最后一个连接列索引会无效。尽量避免连接,可以分开连接或者使用不作用在列上的函数替代。

10.

11.  对数据类型不同的列进行比较时,会使索引失效。

 

12.  UNION操作符会对结果进行筛选,消除重复,数据量大的情况下可能会引起磁盘排序。如果不需要删除重复记录,应该使用UNION ALL。

12.

13.  Oracle从下到上处理Where子句中多个查询条件,所以表连接语句应写在其他Where条件前,可以过滤掉最大数量记录的条件必须写在Where子句的末尾。Oracle从右到左处理From子句中的表名,所以在From子句中包含多个表的情况下,将记录最少的表放在最后。Oracle10g以及以上的版本,以及对这个问题就进行了优化,但是这个习惯还是不错的,值得保留。

 

14.  OrderBy语句中的非索引列会降低性能,可以通过添加索引的方式处理。如果排序的数据量比较大,对性能的影响非常大,尽量避免使用。唯一性索引是一个比较好的折中方法;

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。