`
liulanghan110
  • 浏览: 1076838 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

如何设计索引

阅读更多

        一个表建多少索引合适
 
        有人说一个表的索引不能超过6个,这是不对的。衡量索引是否合理不能单纯的用一个数字来判断。在
 
一张表上创建多少索引,创建什么样的索引,并无一定的规律。不能说一张表上有6个索引,就不能再创建第
 
7个索引了。设计索引时应该从应用的角度出发,一切服从应用需要。
 
 
        大家都知道索引会增加维护的成本,影响DML语句的性能,但在一般的OLTP系统中,和DML操作相
 
比,SELECT操作所占的比例要少的多。如果少一个索引,可能导致某张大表经常进行全表扫描,增加的
 
CPU和I/O开销可能达到这个索引维护成本的上百倍。所以不能单独的凭一个数字来判断索引是否合理。
 
        分析索引是否合理,需要将SQL都找出来,按照 buffer get或者physical read 排序,分析排在前面对性
 
能影响较大的SQL,看WHERE 条件和连接条件,然后判断如何创建索引。
 
 
          设计索引时要统筹考虑 
 
        在设计时,必须为执行最为频繁,对系统性能影响较大的SQL设计成本开销最小的索引,而一些次要的
 
SQL,可以和其他SQL共用索引(建立复合索引来共用),这些索引可能并不是最优的,但能满足目前应用
 
的需求。要记住,最优的并不是最好的,最适合的才是最好的。
 
       尽可能的让一个索引为更多的SQL服务,设计合理的复合索引是十分关键的。
 
        适当的时候需要建立符合索引
 
         有这样一个SQL:
 
            select * from table where  A > xxx and B > xxx
 
        在A列上有一个索引,但该SQL在执行时发现通过A的索引筛选出来的有4000条数据,然后通过筛选出
 
最后的结果是10条。既然建一个复合索引(A+B),可以减少400倍的数据读取,为什么不呢?
 
        合并类似索引
 
          比如一个表上有A + B和 A+C  两个索引,设计一个A+B+C索引也许是不错的选择。
      
         比如有A + B+C和 A+C +B两个索引,设计一个A+B+C索引或者A+C +B索引即可,至于设计成 A+B+C
 
还是A+C +B取决于是A + B用的多,还是A+C作为筛选条件时用的多。
 
        比如A+ C+E和A+B+E => 可以设计成A+ C+B+E或其他的,要注意的是,具体字段顺序,要根据应用情
 
况取舍。
 
  
       尽可能将复合索引中选择性强的字段放前面,这样可以减少索引范围扫描成本。
 
        根据实际情况选择索引类别
 
        位图索引和B树索引的使用场合是不同的,位图索引存储的是字段值的位图,当修改索引的字段的值
 
时,会锁定和这个值相等的所有记录。因此,一般来说,某张表如果针对索引列更新、删除、插入比较频
 
繁,是不适合使用位图索引的,不然很容易出现死锁。一般来说OTLP中不适合使用位图索引。但如果不出现
 
死锁或锁增加的情况,在OTLP系统中使用位图索引也是可以的。
 
        要注意函数索引的使用
 
        函数索引和普通索引的维护开销是差不多的。如果系统中不可避免的在某列上使用函数,那么请放心的
使用函数索引吧。
    
           有时候在索引中增加部分额外的字段能起到很好的作用。 
 
          例如:
                SELECT A FROM TABLE WHERE B=:1
 
        对于这样的SQL,一般会创建B列的索引。但如果创建一个A+B的索引,可以避免对表的扫描。当然,
 
这里不是说碰到这样的情况就建立包含SELECT中的列的索引,应该根据实际情况来设计。尽信书不如无
书。
        使用索引时要注意的:
 
        第一:索引必须是有用的。
 
        不使用的索引会增加DML操作的成本,也可能导致错误的执行计划。所以必须清除无用的索引,但要注
意的是,除非有很大的把握,否则不要轻易删除索引。在删除索引时,要确认没有业务会使用到它。
 
        第二,确保表和索引的统计信息的一致性。
 
        如果索引的统计信息和表的统计信息不一致,可能会出现错误的执行计划。对索引分析后,需要对表重
新分析。确保表和索引的统计信息是一致的。
 
         第三,不要在索引列上使用函数。
 
        在索引列上使用函数,会导致索引失效。所以不要在索引列上使用函数。当然,如果确实要使用,可以
 
建立函数索引。
 
      另外,避免索引列上使用隐式的强制转换。比如,索引列A的字段类型为DATE。当和它比较的值是
TIMESTAMP类型时
 
            WHERE create_date > XXX 
 
    会将小类型向大类型转换。这时create_date 会被隐式强转成TIMESTAMP类型。变成
 
            WHERE TO_ TIMESTAMP (create_date)> XXX 
 
    导致不能使用索引。
    
        最后,索引时需要维护的。定期对索引进行评估和维护是十分必要的,关于索引的维护请参考这里:
 
 
 
 
 
 
分享到:
评论

相关推荐

    80设计索引的时候,我们一般要考虑哪些因素呢?(下).pdf

    在设计索引时,我们需要考虑多个因素以确保索引的优化效果,同时避免性能瓶颈。以下是在设计索引时需要考虑的一些重要因素。 首先,设计索引时要分析查询语句,确保查询语句中出现的字段都尽可能地包含在索引中。...

    数据结构课程设计 索引顺序查找

    2. **设计索引结构**:你可以选择不同的数据结构来存储索引,例如数组、链表或者平衡二叉搜索树(如AVL树或红黑树)。关键在于确保索引结构能在常数时间内完成插入和查找操作。 3. **查找操作**:当用户输入要查找...

    mysql数据库设计为表连接设计索引

    在为连接查询设计索引时,需要注意以下几点: - **为本地谓词创建索引**:确保本地谓词能有效地利用索引,以减少需要处理的数据量。 - **考虑表的访问顺序**:选择数据量较小的表作为外层表,并确保其本地谓词能...

    Mysql数据库索引(2)- 为select设计索引- 自学笔记

    ##### 1.1.1 在设计索引的情况下(索引扫描) 假设我们为表 `t_user` 创建了一个索引 `idx_LNAME_FNAME` (LNAME, FNAME)。在这种情况下,查询过程如下: 1. **根据LNAME扫描索引片**:通过索引查找满足LNAME条件的...

    行业-80设计索引的时候,我们一般要考虑哪些因素呢?(下).rar

    在进行80设计索引的过程中,我们面临的是一个复杂而精细的任务,这涉及到多个关键因素的考量。在本文中,我们将深入探讨这些因素,并逐一分析它们对于设计索引的重要性和影响。 首先,我们要理解80设计索引的概念。...

    78设计索引的时候,我们一般要考虑哪些因素呢?(上).pdf

    首先,设计索引时要基于业务需求来分析哪些字段是经常作为查询条件的。在创建表结构之后,需要预测未来对表的查询方式,这对于索引设计至关重要。虽然不可能完全准确地预测出未来所有的查询模式,但在初步设计表结构...

    行业-78设计索引的时候,我们一般要考虑哪些因素呢?(上).rar

    在设计索引这一关键环节,尤其是在IT行业中,我们需要综合考虑多个因素来确保数据的高效存储、检索和管理。本文将探讨在设计索引时需要关注的一些核心要点。 首先,我们来理解索引的基本概念。索引是数据库管理系统...

    79设计索引的时候,我们一般要考虑哪些因素呢?(中).pdf

    通常,我们会为那些类型较小的列设计索引,例如tinyint这类占用磁盘空间较少的字段类型,在执行查询操作时性能会更优。尽管如此,这也不是绝对的规则。在某些情况下,即使字段类型较大,如varchar(255),我们也可能...

    行业-79设计索引的时候,我们一般要考虑哪些因素呢?(中).rar

    当我们在设计索引时,需要考虑多个因素以确保最优的数据库性能。以下是一些关键的因素: 1. **查询需求**:首先,我们需要分析应用程序的查询模式。如果经常有对特定字段的查询操作,那么这些字段就应该是建立索引...

    课程设计-索引顺序表查找

    太好了简单方便实用的软件,支持 课程设计-索引顺序表查找

    索引介绍聚集索引和非聚集索引

    因此,在设计索引时应该谨慎选择合适的字段。 2. **考虑索引的选择性**:索引的值应具有较高的选择性,即不同的值尽可能多。这样可以在查询时更快地过滤掉不必要的行。 3. **合理使用复合索引**:对于复合查询,可以...

    数据库索引设计与优化

    在设计索引时,需要考虑以下因素:选择合适的索引列,通常选择频繁出现在WHERE子句中的列;考虑列的区分度,区分度高的列更适合建立索引;避免对经常更新的列建立索引,因为每次更新都会引起索引的维护,增加额外...

    SQL Server 索引中include的魅力(具有包含性列的索引)

    SQL Server 索引中 include 的魅力(具有包含性列的索引) SQL Server 索引中 include 的魅力(具有包含性列的索引)是指在非聚集索引中添加非键列,以扩展索引的功能,...但是,需要注意在设计索引时的准则和限制。

    sql server 索引设计与优化

    - **常见问题**:文章列举了一些设计索引时常见的问题,并提供了针对性的解决方案。 #### 索引的能与不能 - **理解限制**:了解索引的局限性对于充分利用其优势至关重要。例如,避免页面拆分可以提高索引的性能。 ...

    关于InnoDB的索引大小

    在MySQL数据库系统中,InnoDB存储引擎是默认的引擎,它提供了事务处理、行级锁定以及外键支持,使得InnoDB在许多业务...通过合理设计索引,不仅可以节省存储空间,还能显著提升查询效率,从而优化整体系统的运行效能。

    SQL Server索引设计与调优

    其次,设计索引时应考虑以下原则:选择性、唯一性和更新频率。选择性高的列(即不同值多的列)适合创建索引,因为它们能帮助过滤掉大量无用数据。唯一性对于索引性能至关重要,尤其是在聚集索引中。同时,频繁更新的...

    数据库索引设计和优化

    数据库索引设计与优化是数据库管理系统中至关重要的一个环节,它直接影响到数据查询的效率、存储空间的使用以及系统的整体性能。在这个主题中,我们将深入探讨数据库索引的基础概念、设计原则、优化策略以及实际应用...

    mysql存储与索引技术

    应根据应用需求选择合适的存储引擎,合理设计索引结构,同时关注索引带来的存储和性能影响,以实现数据库的最佳运行状态。在实践中,定期评估和调整索引策略,结合具体的业务场景进行优化,是保持数据库高效运行的...

    mysql 索引与执行计划

    ### MySQL 索引与执行计划 #### 一、索引与执行计划 ##### 1.1 索引入门 在深入探讨之前,我们首先需要理解什么是索引以及其重要性。...合理设计索引和利用执行计划可以显著提升数据检索的速度和效率。

Global site tag (gtag.js) - Google Analytics