• 数据库优化经验


    在这里,作为一名刚进入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

  • 相关阅读:
    [LeetCode] 26. Remove Duplicates from Sorted Array
    [LeetCode] 105. Construct Binary Tree from Preorder and Inorder Traversal
    [LeetCode] 1248. Count Number of Nice Subarrays
    [LeetCode] 37. Sudoku Solver
    [LeetCode] 36. Valid Sudoku
    [LeetCode] 378. Kth Smallest Element in a Sorted Matrix
    [LeetCode] 547. Friend Circles
    [LeetCode] 733. Flood Fill
    [LeetCode] 695. Max Area of Island
    [LeetCode] 994. Rotting Oranges
  • 原文地址:https://www.cnblogs.com/timePasser-leoli/p/7389634.html
Copyright © 2020-2023  润新知