我对数据库编程非常陌生,我想知道索引的负面影响是什么?据我所知,索引加快了必须在数据库中搜索特定值(例如SELECT)的操作。
考虑一下这个例子:
对于表Example (在user_name列上有索引),操作:
SELECT TestField FROM Example WHERE user_name=XXXX将更快地作为索引的结果。
我的问题是:使用索引的缺点是什么?如果一个指数只是给我们带来好处(业绩增长),为什么不设置为默认呢?
发布于 2015-04-24 08:55:59
好吧,您可能可以填写有关索引的书籍,但简而言之,在创建索引时,需要考虑一些问题:
虽然它(大多数情况下)加快了select,但是它减慢了插入、更新和删除,因为数据库引擎不需要只写数据,而且还要写索引。索引需要内存中硬盘上的空间(更重要的是)。无法在RAM中保存的索引是非常无用的。只有几个不同值的列上的索引不能加快选择速度,因为它不能排序很多行(例如,列“性别”,它通常只有两个不同的值-男性,女性)。
例如,如果使用MySQL,则可以检查引擎是否通过在select之前添加"explain“来检查是否对上面的示例EXPLAIN SELECT TestField FROM Example WHERE username=XXXX使用索引。
发布于 2015-04-24 08:58:47
什么是索引,它们在数据库中是什么?
如果没有列索引,user_name系统将不得不逐行扫描整个Example表,以查找所有匹配的条目。如果特定表中的数据分布表明只有几行左右,那么这显然是获取这些行的一种效率低下的方法。
但是,在使用索引时,您要将搜索功能重定向到不同的树结构,这种结构具有更快的查找速度和非常小的深度。
请记住,索引是纯冗余的。数据库索引就像电话簿--一个或任何其他索引--你可能愿意阅读(可能是其中的一部分,以快速找到您想要的内容)。
如果你对一本书的某一章感兴趣,索引会让你相对较快地找到它,这样你就不必浏览很多页才能找到它。
为什么不默认创建索引?
索引是一种数据结构,它在表的旁边创建,并在表被更改时维护自己。它的存在意味着数据存储的使用。
如果要索引大型表上的每一列,则保持索引所需的存储空间将远远超过表本身的大小。
索引结构的自我维护还意味着,每当发生UPDATE, INSERT, DELETE时,都必须更新索引(它是自动完成的,不需要您的操作),但是需要花费时间,这意味着这些操作执行得更慢。
有些情况下,您需要检索大部分表(例如,90%的行将在输出中),或者整个表,在这种情况下,对整个表的序列扫描(没有索引的行为)将比执行树遍历和叶节点链(这是导航索引树结构的行为)更有效。
发布于 2017-03-14 21:03:23
我们为什么不使用索引作为缺省值的主要原因是维护问题。也就是说,当我们通常更新(插入、删除或更新)表中索引的特定列时,必须动态更新索引,这是一个有点费时的过程。此外,维护此索引将成为一种开销。
https://stackoverflow.com/questions/29842622
复制相似问题