在这里,作为一名刚进入IT行业没多久的毛头小子,我只能发表一点个人的鄙见,如有不妥,还请多多见谅。
数据库我最常用的还是Oracle和Mysql了,今天我们不讲两者的区别,我们来谈谈在实际业务中,怎么样提高数据库的访问速度,优化数据库执行效率。
(一)大家都知道的一样东西:索引
对表建立索引的确是优化数据库的一大途径,虽然使用索引能得到查询效率的提高,但是我们也必须注意到它的代价.索引需要空间来存储,也需要定期维护,每当有记录在表中增减或索引列被修改时,索引本身也会被修改.这意味着每条记录的INSERT , DELETE , UPDATE将为此多付出4 , 5 次的磁盘I/O .因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢。定期的重构索引是有必要的.: ALTER INDEX <INDEXNAME> REBUILD <TABLESPACENAME>
不适合建立索引的情况:
1.如果某列存在空值,即使对该列建索引也不会提高性能。任何在where子句中使用is null或is not null的语句优化器是不允许使用索引的。
2.对于有联接的列,即使最后的联接值为一个静态值,优化器是不会使用索引的。
3.如果索引列是函数的一部分.优化器将不使用索引而使用全表扫描
4.sql语句中包含not关键词时
(二)sql 语句全部大写。
特别是列名和表名都大写。 特别是 sql 命令的缓存功能, 更加需要统一大小写。
(三)能不设计外键就不要有外键
有外键约束会影响插入和删除性能, 如果程序能够保证数据的完整性, 那在设计数据库时就去掉外键。
(四)表拆分
在设计表的时候就可以考虑单表是否可以拆成多表操作,但是避免无意义的两个列的表,这是表的浪费。
(五)SELECT子句中避免使用 * 号
ORACLE在解析的过程中,会将 * 依次转换成所有的列名,这个工作是通过查询数据字典完成的,这意味着将耗费更多的时间
(六)使用表的别名
当SQL语句连接多个表时,请使用表的别名并把别名前缀于每个Column上.这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误。
(七)用EXISTS替代IN、用NOT EXISTS替代NOT IN
在子查询中,NOT IN子句将执行一个内部的排序和合并.无论在哪种情况下,NOT IN都是最低效的(因为它对子查询中的表执行了一个全表遍历)。为了避免使用NOT IN ,我们可以把它改写成外连接(Outer Joins)或NOT EXISTS。
(八)优化GROUP BY
提高GROUP BY语句的效率,可以通过将不需要的记录在GROUP BY之前过滤掉.
低效:
SELECT JOB , AVG(SAL) FROM EMP GROUP by JOB HAVING JOB = ‘PRESIDENT‘
高效:
SELECT JOB , AVG(SAL) FROM EMP WHERE JOB = ‘PRESIDENT‘ GROUP by JOB