一个表建多少索引合适
有人说一个表的索引不能超过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
导致不能使用索引。
最后,索引时需要维护的。定期对索引进行评估和维护是十分必要的,关于索引的维护请参考这里:
相关推荐
在设计索引时,我们需要考虑多个因素以确保索引的优化效果,同时避免性能瓶颈。以下是在设计索引时需要考虑的一些重要因素。 首先,设计索引时要分析查询语句,确保查询语句中出现的字段都尽可能地包含在索引中。...
2. **设计索引结构**:你可以选择不同的数据结构来存储索引,例如数组、链表或者平衡二叉搜索树(如AVL树或红黑树)。关键在于确保索引结构能在常数时间内完成插入和查找操作。 3. **查找操作**:当用户输入要查找...
在为连接查询设计索引时,需要注意以下几点: - **为本地谓词创建索引**:确保本地谓词能有效地利用索引,以减少需要处理的数据量。 - **考虑表的访问顺序**:选择数据量较小的表作为外层表,并确保其本地谓词能...
##### 1.1.1 在设计索引的情况下(索引扫描) 假设我们为表 `t_user` 创建了一个索引 `idx_LNAME_FNAME` (LNAME, FNAME)。在这种情况下,查询过程如下: 1. **根据LNAME扫描索引片**:通过索引查找满足LNAME条件的...
在进行80设计索引的过程中,我们面临的是一个复杂而精细的任务,这涉及到多个关键因素的考量。在本文中,我们将深入探讨这些因素,并逐一分析它们对于设计索引的重要性和影响。 首先,我们要理解80设计索引的概念。...
首先,设计索引时要基于业务需求来分析哪些字段是经常作为查询条件的。在创建表结构之后,需要预测未来对表的查询方式,这对于索引设计至关重要。虽然不可能完全准确地预测出未来所有的查询模式,但在初步设计表结构...
在设计索引这一关键环节,尤其是在IT行业中,我们需要综合考虑多个因素来确保数据的高效存储、检索和管理。本文将探讨在设计索引时需要关注的一些核心要点。 首先,我们来理解索引的基本概念。索引是数据库管理系统...
通常,我们会为那些类型较小的列设计索引,例如tinyint这类占用磁盘空间较少的字段类型,在执行查询操作时性能会更优。尽管如此,这也不是绝对的规则。在某些情况下,即使字段类型较大,如varchar(255),我们也可能...
当我们在设计索引时,需要考虑多个因素以确保最优的数据库性能。以下是一些关键的因素: 1. **查询需求**:首先,我们需要分析应用程序的查询模式。如果经常有对特定字段的查询操作,那么这些字段就应该是建立索引...
太好了简单方便实用的软件,支持 课程设计-索引顺序表查找
因此,在设计索引时应该谨慎选择合适的字段。 2. **考虑索引的选择性**:索引的值应具有较高的选择性,即不同的值尽可能多。这样可以在查询时更快地过滤掉不必要的行。 3. **合理使用复合索引**:对于复合查询,可以...
在设计索引时,需要考虑以下因素:选择合适的索引列,通常选择频繁出现在WHERE子句中的列;考虑列的区分度,区分度高的列更适合建立索引;避免对经常更新的列建立索引,因为每次更新都会引起索引的维护,增加额外...
SQL Server 索引中 include 的魅力(具有包含性列的索引) SQL Server 索引中 include 的魅力(具有包含性列的索引)是指在非聚集索引中添加非键列,以扩展索引的功能,...但是,需要注意在设计索引时的准则和限制。
- **常见问题**:文章列举了一些设计索引时常见的问题,并提供了针对性的解决方案。 #### 索引的能与不能 - **理解限制**:了解索引的局限性对于充分利用其优势至关重要。例如,避免页面拆分可以提高索引的性能。 ...
在MySQL数据库系统中,InnoDB存储引擎是默认的引擎,它提供了事务处理、行级锁定以及外键支持,使得InnoDB在许多业务...通过合理设计索引,不仅可以节省存储空间,还能显著提升查询效率,从而优化整体系统的运行效能。
其次,设计索引时应考虑以下原则:选择性、唯一性和更新频率。选择性高的列(即不同值多的列)适合创建索引,因为它们能帮助过滤掉大量无用数据。唯一性对于索引性能至关重要,尤其是在聚集索引中。同时,频繁更新的...
数据库索引设计与优化是数据库管理系统中至关重要的一个环节,它直接影响到数据查询的效率、存储空间的使用以及系统的整体性能。在这个主题中,我们将深入探讨数据库索引的基础概念、设计原则、优化策略以及实际应用...
应根据应用需求选择合适的存储引擎,合理设计索引结构,同时关注索引带来的存储和性能影响,以实现数据库的最佳运行状态。在实践中,定期评估和调整索引策略,结合具体的业务场景进行优化,是保持数据库高效运行的...
### MySQL 索引与执行计划 #### 一、索引与执行计划 ##### 1.1 索引入门 在深入探讨之前,我们首先需要理解什么是索引以及其重要性。...合理设计索引和利用执行计划可以显著提升数据检索的速度和效率。