`
hucj
  • 浏览: 8164 次
社区版块
存档分类
最新评论

关于数据库的总结

db 
阅读更多

参考:

     http://blog.csdn.net/axin66ok/article/details/7891386 

     http://blog.csdn.net/mis_lixiaoli/article/details/6331312

 

摘自以上两篇文章!!!

 

一、操作符的优化

     1、exists 替换 in  。

     2、not in (not in 不能应用索引)用NOT EXISTS或(外连接+判断为空)方案代替。

     3、is null 、is not null 判断字段是否为空 一般是不会应用索引,并且将导致引擎放弃使用索引而进行全表扫描,可以使用 >0 或者 >''替换

     4、like关键字不会应用索引,由于like可以使用通配符查询,里面的通配符组合可能达到几乎所有的任意查询
但是like使用得不好会引起性能上的问题,如LIKE ‘%5400%’这种查询不会引用索引,而LIKE‘X5400%’则会引用范围索引。一个实际例子:用YW_YHJBQK表中营业编号后面的户标识号可来查询营业编号 YY_BH LIKE‘%5400%’ 这个条件会产生全表扫描,如果改成YY_BH LIKE ’X5400%’ OR YY_BH LIKE ’B5400%’则会利用YY_BH的索引进行两个范围的查询,性能肯定大大提高。

     5、用UNION替换OR (适用于索引列),通常情况下, UNION替换WHERE 子句中的OR 将会起到较好的效果.对索引列使用OR 将造成全表扫描. 注意,以上规则只针对多个索引列有效.如果有column 没有被索引, 查询效率可能会因为你没有选择OR而降低.。

     6、用IN来替换OR。

     7、SELECT子句中避免使用‘ * ‘

 

二、数据库优化方案

    1、 利用表分区,分区将数据在物理上分隔开,不同分区的数据可以制定保存在处于不同磁盘上的数据文件 里。这样,当对这个表进行查询时,只需要在表分区中进行扫描,而不必进行全表扫描,明显缩短了查询时间,另外处于不同磁盘的分区也将对这个表的数据传输分 散在不同的磁盘I/O,一个精心设置的分区可以将数据传输对磁盘I/O竞争均匀地分散开。对数据量大的时时表可采取此方法。可按月自动建表分区。

     2、别名的使用,别名是大型数据库的应用技巧,就是表名、列名在查询中以一个字母为别名,查询速度要比建连接表快1.5倍。

      3、 索引Index的优化设计。索引可以大大加快数据库的查询速度,索引把表中的逻辑值映射到安全的RowID,因此 索引能进行快速定位数据的物理地址。对一个建有索引的大型表的查询时,索引数据可能会用完所有的数据块缓存空间,ORACLE不得不频繁地进行磁盘读写来 获取数据,因此在对一个大型表进行分区之后,可以根据相应的分区建立分区索引。但是个人觉得不是所有的表都需要建立索引,只针对大数据量的表建立索引。

 

缺点: 第一,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物 理空间,如果要建立聚簇索引,那么需要的空间就会更大。第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速 度。索引需要维护:为了维护系统性能,索引在创建之后,由于频繁地对数据进行增加、删除、修改等操作使得索引页发生碎块,因此,必须对索引进行维护。

 

三、原则

     保证在实现功能的基础上,尽量减少对数据库的访问次数;通过搜索参数,尽量减少对表的访问行数,最小化结果集,从而减轻网络负担;能够分开的操作尽量分开处理,提高每次的响应速度;在数据窗口使用SQL时,尽量把使用的索引放在选择的首列;算法的结构尽量简单。

     1、能用UNION ALL就不要用UNION ,UNION ALL不执行SELECT DISTINCT函数,这样就会减少很多不必要的资源
     2、尽量不要用SELECT INTO语句,SELECT INOT 语句会导致表锁定,阻止其他用户访问该表。

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

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

     5、应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:
select id from t where substring(name,1,3)='abc'--name以abc开头的id。应改为:select id from t where name like 'abc%'

     6、应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:SELECT * FROM T1 WHERE F1/2=100  应改为: SELECT * FROM T1 WHERE F1=100*2

     

 

分享到:
评论
1 楼 kevinflynn 2019-01-05  
hucj 写道
干了这碗 鸡汤

[flash=200,200"><img>][/flash]





相关推荐

Global site tag (gtag.js) - Google Analytics