索引的利弊与如何判定,是否需要索引

2024-05-10

1. 索引的利弊与如何判定,是否需要索引

8.4.5  相信读者都知道索引能够极大地提高数据检索的效率,让Query 执行得更快,但是可能并不是每一位朋友都清楚索引在极大提高检索效率的同时,也给数据库带来了一些负面的影响。下面就分别对 MySQL 中索引的利与弊做一个简单的分析。索引的好处 索引带来的益处可能很多读者会认为只是"能够提高数据检索的效率,降低数据库的IO成本"。 确实,在数据库中表的某个字段创建索引,所带来的最大益处就是将该字段作为检索条件时可以极大地提高检索效率,加快检索时间,降低检索过程中须要读取的数据量。但是索引带来的收益只是提高表数据的检索效率吗?当然不是,索引还有一个非常重要的用途,那就是降低数据的排序成本。
我们知道,每个索引中的数据都是按照索引键键值进行排序后存放的,所以,当Query 语句中包含排序分组操作时,如果排序字段和索引键字段刚好一致,MySQL Query Optimizer 就会告诉 mysqld 在取得数据后不用排序了,因为根据索引取得的数据已经满足客户的排序要求。 那如果是分组操作呢?分组操作没办法直接利用索引完成。但是分组操作是须要先进行排序然后分组的,所以当Query 语句中包含分组操作,而且分组字段也刚好和索引键字段一致,那么mysqld 同样可以利用索引已经排好序的这个特性,省略掉分组中的排序操作。 排序分组操作主要消耗的是内存和 CPU 资源,如果能够在进行排序分组操作中利用好索引,将会极大地降低CPU资源的消耗。索引的弊端 索引的益处已经清楚了,但是我们不能只看到这些益处,并认为索引是解决 Query 优化的圣经,只要发现 Query 运行不够快就将 WHERE 子句中的条件全部放在索引中。 确实,索引能够极大地提高数据检索效率,也能够改善排序分组操作的性能,但有不能忽略的一个问题就是索引是完全独立于基础数据之外的一部分数据。假设在Table ta 中的Column ca 创建了索引 idx_ta_ca,那么任何更新 Column ca 的操作,MySQL在更新表中 Column ca的同时,都须要更新Column ca 的索引数据,调整因为更新带来键值变化的索引信息。而如果没有对 Column ca 进行索引,MySQL要做的仅仅是更新表中 Column ca 的信息。这样,最明显的资源消耗就是增加了更新所带来的 IO 量和调整索引所致的计算量。此外,Column ca 的索引idx_ta_ca须要占用存储空间,而且随着 Table ta 数据量的增加,idx_ta_ca 所占用的空间也会不断增加,所以索引还会带来存储空间资源消耗的增加。如何判定是否须要创建索引 在了解了索引的利与弊之后,那我们到底该如何来判断某个索引是否应该创建呢? 实际上,并没有一个非常明确的定律可以清晰地定义什么字段应该创建索引,什么字段不该创建索引。因为应用场景实在是太复杂,存在太多的差异。当然,还是仍然能够找到几点基本的判定策略来帮助分析的。1. 较频繁的作为查询条件的字段应该创建索引 提高数据查询检索的效率最有效的办法就是减少须要访问的数据量,从上面索引的益处中我们知道,索引正是减少通过索引键字段作为查询条件的 Query 的IO量之最有效手段。所以一般来说应该为较为频繁的查询条件字段创建索引。2. 唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件 唯一性太差的字段主要是指哪些呢?如状态字段、类型字段等这些字段中存放的数据可能总共就是那么几个或几十个值重复使用,每个值都会存在于成千上万或更多的记录中。对于这类字段,完全没有必要创建单独的索引。因为即使创建了索引,MySQL Query Optimizer 大多数时候也不会去选择使用,如果什么时候 MySQL Query Optimizer选择了这种索引,那么非常遗憾地告诉你,这可能会带来极大的性能问题。由于索引字段中每个值都含有大量的记录,那么存储引擎在根据索引访问数据的时候会带来大量的随机IO,甚至有些时候还会出现大量的重复IO。 这主要是由于数据基于索引扫描的特点引起的。当我们通过索引访问表中数据时,MySQL 会按照索引键的键值顺序来依序访问。一般来说,每个数据页中大都会存放多条记录,但是这些记录可能大多数都不会和你所使用的索引键的键值顺序一致。 假如有以下场景,我们通过索引查找键值为A和B的某些数据。在通过A键值找到第一条满足要求的记录后,会读取这条记录所在的 X 数据页,然后继续往下查找索引,发现 A 键值所对应的另外一条记录也满足要求,但是这条记录不在 X 数据页上,而在Y数据页上,这时候存储引擎就会丢弃X数据页,而读取Y数据页。如此继续一直到查找完A键值所对应的所有记录。然后轮到B键值了,这时发现正在查找的记录又在X数据页上,可之前读取的 X 数据页已经被丢弃了,只能再次读取 X 数据页。这时候,实际上已经重复读取 X 数据页两次了。在继续往后的查找中,可能还会出现一次又一次的重复读取,这无疑给存储引擎极大地增加了IO访问量。 不仅如此,如果一个键值对应了太多的数据记录,也就是说通过该键值会返回占整个表比例很大的记录时,由于根据索引扫描产生的都是随机 IO,其效率比进行全表扫描的顺序IO效率低很多,即使不会出现重复 IO 的读取,同样会造成整体 IO 性能的下降。 很多比较有经验的 Query 调优专家经常说,当一条Query返回的数据超过了全表的 15%时,就不应该再使用索引扫描来完成这个 Query 了。对于"15%"这个数字我们并不能判定是否很准确,但是至少侧面证明了唯一性太差的字段并不适合创建索引。3. 更新非常频繁的字段不适合创建索引 上面在索引的弊端中已经分析过了,索引中的字段被更新的时候,不仅要更新表中的数据,还要更新索引数据,以确保索引信息是准确的。这个问题致使IO 访问量较大增加,不仅仅影响了更新 Query 的响应时间,还影响了整个存储系统的资源消耗,加大了整个存储系统的负载。 当然,并不是存在更新的字段就适合创建索引,从判定策略的用语上也可以看出,是"非常频繁"的字段。到底什么样的更新频率应该算是"非常频繁"呢?每秒?每分钟?还是每小时呢?说实话,还真难定义。很多时候是通过比较同一时间段内被更新的次数和利用该字段作为条件的查询次数来判断的,如果通过该字段的查询并不是很多,可能几个小时或是更长才会执行一次,更新反而比查询更频繁,那这样的字段肯定不适合创建索引。反之,如果我们通过该字段的查询比较频繁,但更新并不是特别多,比如查询几十次或更多才可能会产生一次更新,那我个人觉得更新所带来的附加成本也是可以接受的。4. 不会出现在 WHERE 子句中的字段不该创建索引 不会还有人会问为什么吧?自己也觉得这是废话了,哈哈!

索引的利弊与如何判定,是否需要索引

2. ca数据库中,哪些字段更适合索引检索

在“快速检索”中有十二个检索字段:“M=题名或关键词、K=关键词、J=刊名、A=作者、F=第一作者、S=机构、T=题名、R=文摘、C=分类号、Z=作者简介、I=基金资助、L=栏目信息”。
在“传统检索”中有除了上述十二个外,还多两个检索字段:“U=任意字段、Y=参考文献”。
在“高级检索”和“分类检索”中,除了“快速检索”的十二个检索字段外,只多一个:“U=任意字段”。 希望可以帮到你。

3. 在mysql数据库中为字段添加索引,是什么意思,有什么好处,谢谢!!

在mysql数据库中为字段添加索引,意思是对数据库某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页进行排序,它是逻辑指针清单。
索引提供指向存储在表的指定列中的数据值的指针,然后根据指定的排序顺序对这些指针排序。数据库使用索引以找到特定值,然后顺指针找到包含该值的行。这样可以使对应于表的SQL语句执行得更快,可快速访问数据库表中的特定信息。

扩展资料:
当现有数据中存在重复的键值时,大多数数据库不允许将新创建的唯一索引与表一起保存。数据库还可能防止添加将在表中创建重复键值的新数据。例如,如果在 employee 表中职员的姓 (lname) 上创建了唯一索引,则任何两个员工都不能同姓。
对某个列建立UNIQUE索引后,插入新记录时,数据库管理系统会自动检查新纪录在该列上是否取了重复值,在CREATE TABLE 命令中的UNIQE约束将隐式创建UNIQUE索引。

在mysql数据库中为字段添加索引,是什么意思,有什么好处,谢谢!!

4. 数据库的哪些字段适合添加索引

索引的目的是提高你的查询速度,当然附带的后果就是会降低你的数据更新的性能,索引的创建依据一般都是根据你实际使用情况而定,也就是说你要用哪个或者那几个字段作为查询条件,就在这个字段或者这些字段上面建立索引,也就是所谓的单字段索引和复合字段索引,比如:
select * from student where id = 1
上面这种情况那自然就是在id上建立索引,复合索引以此类推,索引不是随意创建的,如果你用的上,那才能建立索引,如果用不上创建索引反而会降低你的数据库性能。
建议楼主去查一下有关“利用索引查询数据提高性能”之类的帖子,这样你就能对索引的意义有比较深刻的了解了。

5. 数据库记录中的常见字段有哪些?限定字段检索有什么好处??

字段限定检索是指限定检索词在数据库记录中的一个或几个字段范围内查找的一种检索方法。在检索系统中,数据库设置的可供检索的字段通常有两种:表达文献主题内容特征的基本字段和表达文献外部特征的辅助字段。基本字段包括篇名、文摘、叙词、自由标引词四个字段。辅助字段包括除基本字段以外的所有字段。每个字段都有用2 个字母表示的字段标识符。在DIALOG 检索系统的命令检索模式中,使用字段限制检索时,基本字段用后缀表示,辅助字段用前缀表示。例如,computer and network/TI,DE 表示将检索式限定在篇名字段(TI)和叙词字段(DE)中;要查找著者Smith D.发表的文献,检索式可表示为AU=Smith, D.。在多数检索系统中,如果用户不对检索式注明字段限定范围,系统会默认在四个基本字段中检索。

数据库记录中的常见字段有哪些?限定字段检索有什么好处??

6. 哪些字段适合建立索引 那些字段适不适合建索引

经常需要进行更新操作的属性

1、表的主键、外键必须有索引;
2、数据量超过300的表应该有索引;
3、经常与其他表进行连接的表,在连接字段上应该建立索引;
4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;
5、索引应该建在选择性高的字段上;
6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;
7、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:
A、正确选择复合索引中的主列字段,一般是选择性较好的字段;
B、复合索引的几个字段是否经常同时以AND方式出现在Where子句中?单字段查询是否极少甚至没有?如果是,则可以建立复合索引;否则考虑单字段索引;

7. 数据库中的索引是什么意思?

索引是一个单独的、物理的数据库结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。 
  索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序。数据库使用索引的方式与您使用书籍中的索引的方式很相似:它搜索索引以找到特定值,然后顺指针找到包含该值的行。
  在数据库关系图中,您可以在选定表的“索引/键”属性页中创建、编辑或删除每个索引类型。当保存索引所附加到的表,或保存该表所在的关系图时,索引将保存在数据库中。
索引与目录的作用类似

数据库中的索引是什么意思?

8. 2. 创建索引有什么优点和缺点?在哪些列上适合创建索引?在哪些列上不适合创建索引?

数据库中索引的优缺点 
为什么要创建索引呢?这是因为,创建索引可以大大提高系统的性能。第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。第二,可以大大加快数据的检索速度,这也是创建索引的最主要的原因。第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。第四,在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。 

也许会有人要问:增加索引有如此多的优点,为什么不对表中的每一个列创建一个索引呢?这种想法固然有其合理性,然而也有其片面性。虽然,索引有许多优点,但是,为表中的每一个列都增加索引,是非常不明智的。这是因为,增加索引也有许多不利的一个方面。第一,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。 

索引是建立在数据库表中的某些列的上面。因此,在创建索引的时候,应该仔细考虑在哪些列上可以创建索引,在哪些列上不能创建索引。一般来说,应该在这些列上创建索引,例如:在经常需要搜索的列上,可以加快搜索的速度;在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度;在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。 

同样,对于有些列不应该创建索引。一般来说,不应该创建索引的的这些列具有下列特点:第一,对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。第二,对于那些只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。第三,对于那些定义为text, image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。第四,当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大于检索性能时,不应该创建索引。