(08)DBA写给开发的索引经验

时间:2022-09-11 21:33:41
      索引可是个大事情,翻开任意一本数据库调优的书,索引都会占到比较大的篇幅。这是个人人都很重视的问题,可往往起始阶段还好,但数据库到最后常常还是会陷入由索引起的性能怪圈中。特别是在上线运行过一段时间的系统上表现特别明显. 人们为了提高查询速度,或者说自认为可以提高速度。所以不停的向上面加索引,改索引,加索引。极端的甚至每个字段都建或者是一个有什么查询就建个索引先,种种乱象大把。由此产生太多的无效索引,占用大量系统空间,拖慢相关表的写入性能,增加系统的waits.由此引发一堆的问题 。
      造成这些往往是开发不会正确的建索引。其实有DBA参与的项目有时也会出现由索引引起的问题,更别说很多项目是没有DBA参与或后期没有DBA了,直到数据库出现严重问题. 
       索引这东西太值得深入研究了,网上有很多很多DBA对它们做各类测试和研究。数据库每次发新版本,也会对这个特性更新点新东西。不过那都离开发稍有点远。我在这只想介绍一些有用的方法给开发,让他们可以放心的在项目享受索引的魔力,而不用太担心被它所伤。
     先声明一点,调优没那么简单,水深得很。我在这只说些通常情况下我认为大致可行的办法,并不适合所有情况。
    就索引而言,先要明白几个概念:
         索引不是一定能提高性能的。        
         索引也不是越多越好。
         索引本身也是占用空间,牺牲表的写入性能。 
    具体为什么我就不在这占地方写了,大把的文章说这些。 

你加索引时只要知道这几点:
 1.找到说服自己的理由
    在确定要加索引时,首先要搞明白是确实碰到性能问题了,查询要花很多时间?
    还是因为很多SQL的WHERE条或关联需用到这个?
     如果不是这两种情况,那就要再思考一下了。
 2. 多尝试,找出最合适的索引组合。
    你确定要加索引了。现在有几个问题,
      a. WHERE 条件用到表的两个字段,那到底是分别建两个单键索引还是合在一起建一个复合索引? 
      b.或者说,其中一个列已有建一个索引,那我还需要建个复合索引吗?  
      下决定前,你要清楚它们各自的优势在哪。
          查询特定的列的记录,单索引肯定比复合索引快,至于快多少,那很难有个定量的。要靠实际环境的测试。
         复合索引组合对这个同时使用了两个字段的情况肯定提速要明显,而且原来使用了单索引的其它SQL,照样能
         享受到索引的福利。不过复合索引字段多,占的空间相对要大,查询时访问的数据块也要多,消耗的资源也大。
         总之两者各有千秋。 
       你要评估下哪种WHERE条件和连接条件用得比较多,哪些SQL的优先级比较高,有条件最好再实际测试一下速度。
   3. 具体选择什么类型的索引?
 数据库的索引种类非常之多,不要一知半解去玩,很多就玩出问题了,我后面会具体另外花时间写写这个。我在这
只建议就用默认建立的那种索引好了, 其它索引你要确定搞清楚了再用。
   4. 索引增加或重建操作要小心
          别想当然的去直接操作,其实可不简单有注意事项的。
       a. 操作前要做好检查。
            做过Oracle表设计的都知道一个潜规则,通常会把数据表空间和索引表空间分开,以减少磁盘I/O竞争和便于管理。
            但这说明了一个问题,索引确确实实是占空间的,那你建索引前尤其是大表,最好评估下索引表空间是否够。
       b. 操作要看时机。
           对于已上线的系统,不到万不得已,尽量尽量不要在业务高峰期操作,尤其是对大表。会消耗掉大量的系统资源。
        并引发不可料的问题。 实际上好多库出问题就出在这种操作上,听我一句劝,不要自己给自己找麻烦。
        
 上面说的是加索引的情况,如果你现在的数据库已经是一团乱麻了,你也分不清这些个索引到底有用没。
     可以看看我下面的方法。
           
 
 
    1. 有事没事从em或数据库视图中找出消耗性能最多的SQL,
         找出来,把表关系,表相关的索引拿出来细细分析,确定其合理性。
    2. 从视图中查出索引最多的相关表,看看相关的SQL,是否真需要那么多索引。
    3. 通过索引监控,找出无用的索引.将其去掉.
       对索引做监控时,监控的周期要注意. 有些索引如仓库盘点表上的索引.
       被调用的时隔很长,如刚好不在你的监控周期以内. 你轻易删除了,到用就要
   手忙脚乱地面对由此引起的性能问题. 所以删除时一定要对业务有了解.确认过后再处理.

对于如何确定一个索引,到底有用还是没用,可以采用下面的小技巧.

    (再强调下,具体操作命令别在业务高峰期玩)
            11g前,
      先将索引更改为unusable状态,让删除不需要与表数据同步更新.
      如过了比较长的周期,确认这个是没用的,再将其删除就很保险了.
      万一要重新使用时,只需要用rebuild重建,并更新一下统计信息即可.
      不过,如果索引刚好在一张大表上.这个动作要花的时间可能就会很长.
            11g及以后
             可用索引不可见.(Index Invisible)这个新特性。让数据库的优化器彻底无视这个索引。
        而这个索引并没有被删除,也同样会与表做同步更新。这意味着,你确定还需要这索引时,
        只要用命令重新让它们可见就好了。无需再去做索引的重建动作了。

     通过上面的这些操作,坚持下去,细水长流,数据库的性能自然会上去。由索引引起的问题也会少很多的。
    
     上面纯是口水文,说到具体的相关技术点可以自己去查,我以后有时间也会再做补充说明。
 总之希望各自的项目都顺顺利利,稳稳当当,天下大同,世界和平。

MAIL:xcl_168@aliyun.com

(08)DBA写给开发的索引经验的更多相关文章

  1. 【转】微信公众账号 Senparc.Weixin.MP SDK 开发教程 索引

    微信公众账号 Senparc.Weixin.MP SDK 开发教程 索引 Senparc.Weixin.MP SDK从一开始就坚持开源的状态,这个过程中得到了许多朋友的认可和支持. 目前SDK已经达到 ...

  2. SQL点滴17—使用数据库引擎存储过程,系统视图查询,DBA,BI开发人员必备基础知识

    原文:SQL点滴17-使用数据库引擎存储过程,系统视图查询,DBA,BI开发人员必备基础知识 在开发过程中会遇到需要弄清楚这个数据库什么时候建的,这个数据库中有多少表,这个存储过程长的什么样子等等信息 ...

  3. Alibaba Java开发手册索引规约学习笔记

    最近一段时间再看阿里巴巴 Java开发手册索引规约,写篇帖子总结一下,索引规约内容如下 为了通用,更为了避免造数据的痛苦,文中所涉及表.数据,均来自于MySQL官网提供的示例库employees,可通 ...

  4. supermap开发webgis的经验

    SuperMap 开发WebGIS的经验总结 - 综合课件 - 道客巴巴 http://www.doc88.com/p-743552004620.html

  5. 【转】oracle数据库开发的一些经验积累

    1.不安装Oracle客户连接Oracle 8的方法  请将以下文件拷贝到运行文件所在目录 一.ODBC动态库 : ctl3d32.dll msvcrt40.dll odbc16gt.dll odbc ...

  6. Hybrid APP混合开发的一些经验和总结

    http://www.cnblogs.com/kingplus/p/5588339.html 写在前面: 由于业务需要,接触到一个Hybrid APP混合开发的项目.当时是第一次接触混合开发,有一些经 ...

  7. 微信公众账号 Senparc.Weixin.MP SDK 开发教程 索引

    Senparc.Weixin.MP SDK从一开始就坚持开源的状态,这个过程中得到了许多朋友的认可和支持. 目前SDK已经达到比较稳定的版本,这个过程中我觉得有必要整理一些思路和经验,和大家一起分享. ...

  8. Android IOS WebRTC 音视频开发总结(六)-- iOS开发之含泪经验

    前段时间在搞webrtc iOS开发,所以将标题改为了Android IOS WebRTC 音视频开发总结, 下面都是开发过程中的经验总结,转载请说明出处(博客园RTC.Blacker): 1. IO ...

  9. Senparc.Weixin.MP SDK 微信公众平台开发教程 索引

    Senparc.Weixin.MP SDK从一开始就坚持开源的状态,这个过程中得到了许多朋友的认可和支持. 目前SDK已经达到比较稳定的版本,这个过程中我觉得有必要整理一些思路和经验,和大家一起分享. ...

随机推荐

  1. Javascript中两个等于号和三个等于号的区别(==/===)

    ==//表示值的比较 ===//表示对象类型的比较 1.对于string,number等基础类型,==和===是有区别的. a)不同类型间比较,==之比较“转化成同一类型后的值”看“值”是否相等,== ...

  2. xml学习

    一,数据类型 xmlChar  对char的基本代替,是一个UTF-8编码字符串中的一个字节.如果你的数据使用了其他编码,在使用libxml函数前就必须转换为UTF-8. xmlDoc和xmlDocP ...

  3. (2/18)重学Standford_iOS7开发_Xcode_课程笔记

    第二课: 1.惰性初始化 -(ObjectType *)example { f(!_example) example =[[ObjectType alloc] init]; return _examp ...

  4. 【转】Java 字符串常用操作(String类)

    原文网址:http://www.cnblogs.com/freeabyss/archive/2013/05/15/3187057.html 字符串查找 String提供了两种查找字符串的方法,即ind ...

  5. Linux如何创建一个新进程

    2016-03-31 张超<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 Linux如何创建一个新进程 ...

  6. NOPI使用手册

    目录 1. 认识NPOI 2. 使用NPOI生成xls文件 2.1 创建基本内容 2.1.1 创建Workbook和Sheet 2.1.2 创建DocumentSummaryInformation和S ...

  7. 【java】缓冲字符字节输入输出流:java&period;io&period;BufferedReader、java&period;io&period;BufferedWriter、java&period;io&period;BufferedInputStream、java&period;io&period;BufferedOutputStream

    BufferedReader最重要,因为有个方法public String readLine() package System输入输出; import java.io.BufferedReader; ...

  8. pymsql模块

    老师的博客地址:http://www.cnblogs.com/wupeiqi/articles/5713330.html 通过pymysql 模块可以通过朋友去操作mysql 数据库,首先的在pip上 ...

  9. (原创)C&plus;&plus;11改进我们的程序之简化我们的程序(七)

    这次要讲的内容是:c++11中的tuple(元组).tuple看似简单,其实它是简约而不简单,可以说它是c++11中一个既简单又复杂的东东,关于它简单的一面是它很容易使用,复杂的一面是它内部隐藏了太多 ...

  10. python学习笔记之——python函数

    1.定义一个函数 你可以定义一个自己想要功能的函数,以下是简单的规则: 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号(). 任何传入参数和自变量必须放在圆括号中间.圆括号之间可以用于定 ...