数据库优化

来源:互联网 发布:淘宝企业店开店流程 编辑:程序博客网 时间:2024/05/22 02:01

浅谈数据库的优化

 

一、表设计优化

二、查询语句优化

 

1.表设计优化

 (1) 数据行的长度不要超过8020字节,如果超过这个长度的话在物理页中这条数据会占用两行从而造成存储碎片,降低查询效率。

(2) 能够用数字类型的字段尽量选择数字类型而不用字符串类型的(电话号码),这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接回逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。

(3)对于不可变字符类型char和可变字符类型varchar 都是8000字节,char查询快,但是耗存储空间,varchar查询相对慢一些但是节省存储空间。在设计字段的时候可以灵活选择,例如用户名、密码等长度变化不大的字段可以选择CHAR,对于评论等长度变化大的字段可以选择VARCHAR。

(4)字段的长度在最大限度的满足可能的需要的前提下,应该尽可能的设得短一些,这样可以提高查询的效率,而且在建立索引的时候也可以减少资源的消耗。

(5)为了保证数据库的一致性和完整性,在逻辑设计的时候往往会设计过多的表间关联,尽可能的降低数据的冗余。

(6)最好不要用自增属性字段作为主键与子表关联,不便于系统的迁移和数据恢复。对外统计系统映射关系丢失

2.查询语句优化

  优化查询最重要的就是:尽量使语句符合查询优化器的规则避免全表扫描而使用索引查询。

注意:

(1)保证在实现功能的基础上,尽量减少对数据库的访问次数

(2)通过搜索参数,尽量减少对表的访问行数,最小化结果集,从而减轻网络负担

(3)能够分开的操作尽量分开处理,提高每次的响应速度

(4)算法的结构尽量简单

(5)在查询时,不要过多地使用通配符如SELECT * FROM T1语句,要用到几列就选择几列如:SELECT COL1,COL2 FROM T1

(6)在可能的情况下尽量限制尽量结果集行数如:SELECT TOP 300 COL1,COL2,COL3 FROM T1,因为某些情况下用户是不需要那么多的数据的

(7)在没有建索引的情况下,数据库查找某一条数据,就必须进行全表扫描了,对所有数据进行一次遍历,查找出符合条件的记录。在数据量比较小的情况下,也许看不出明显的差别,但是当数据量大的情况下,这种情况就是极为糟糕的了。

Eg:

select * from table1 wherename='zhangsan' and tID > 10000;

select * from table1 where tID > 10000and name='zhangsan';

因为如果简单的从语句先后上看,这两个语句的确是不一样,如果tID是一个聚合索引,那么后一句仅仅从表的10000条以后的记录中查找就行了;而前一句则要先从全表中查找看有几个name='zhangsan'的,而后再根据限制条件条件tID>10000来提出查询结果。 

事实上,这样的担心是不必要的。SQL SERVER中有一个“查询分析优化器”,它可以计算出where子句中的搜索条件并确定哪个索引能缩小表扫描的搜索空间,也就是说,它能实现自动优化。虽然查询优化器可以根据where子句自动的进行查询优化,但有时查询优化器就会不按照您的本意进行快速查询。 

具体注意

1.应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,

如:select * from emp where deptno=10 or deptno=20;

可以这样查询:select * from emp where deptno=10 union all select * from empwhere deptno=2;;

2.in 和 not in 也要慎用,因为IN会使系统无法使用索引,而只能直接搜索表中的数据;

如:select * from emp where deptno in(10,20);
可以这样查询:对于连续的数值,能用 between...and就不要用 in

select * from emp where deptno between 10and 20;

3.应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。

如1:select* from emp where deptno/2=10;

可以这样查询: select* from emp where deptno=10*2;

如2:select * from emp wheresubstr(empno,1,3)='778';

可以这样查询: select * from emp where empno like'778%';

4.不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。

如1:select* from emp where deptno/3=10;

可以这样查询: select* from emp where deptno=30;

5.充分利用连接条件,在某种情况下,两个表之间可能不只一个的连接条件,这时在 where 子句中将连接条件完整的写上,有可能大大提高查询速度。 

如:select sum(a.amount) from account a,cardb where a.card_no = b.card_no 

可以这样查询:select sum(a.amount) from account a,cardb where a.card_no = b.card_no and a.account_no=b.account_no;

6.  distinct groupby的对比   

select deptno from emp group by deptno;

select distinct deptno from emp;

 

 

 

 

原创粉丝点击