为什么以及在哪里使用INDEXes - 利弊

问题描述 投票:11回答:4

我对数据库编程很陌生,我想知道索引的负面影响是什么?据我所知,索引加速了必须在数据库中搜索特定值的操作(例如SELECT)。

考虑这个例子:

对于表Example,列user_name的索引,操作:

SELECT TestField FROM Example WHERE user_name=XXXX

由于索引会更快。

我的问题是:使用索引的缺点是什么?如果一个索引只给我们专业人士(性能提升),他们为什么不设置为默认值?

mysql sql select indexing
4个回答
20
投票

那么你可以填写有关索引的书籍,但总之,在创建索引时需要考虑以下几点:

虽然它(大多数)加速了select,但它减慢了插入,更新和删除的速度,因为数据库引擎不必仅写入数据,而是编写索引。索引需要RAM中的硬盘空间(更重要的是)。无法保存在RAM中的索引是没用的。仅具有少量不同值的列上的索引不会加快选择速度,因为它无法对多行进行排序(例如,列“性别”,通常只有两个不同的值 - 男性,女性)。

如果您使用MySQL作为示例,您可以检查,如果引擎使用索引通过在选择之前添加“explain” - 对于您的上述示例qazxsw poi


10
投票

什么是索引,它们在数据库中是什么?

如果没有列EXPLAIN SELECT TestField FROM Example WHERE username=XXXX系统上的索引,则必须逐行扫描整个user_name表以查找所有匹配的条目。如果特定表中的数据分布指出只有几行左右,这显然是获得这些行的低效方法。

但是,在使用索引时,您将搜索功能重定向到另一个树结构,该结构具有更快的查找和非常小的深度。

请记住,索引是纯冗余。数据库索引就像电话簿中的一个或您可能愿意阅读的书中的任何其他索引(可能是快速找到您要查找的内容的一部分)。

如果您对书的一个章节感兴趣,索引可以让您相对快速地找到它,这样您就不必浏览很多页面来获取它。

为什么默认情况下不创建索引?

索引是一个与表一起创建的数据结构,并在表更改时自行维护。它存在的事实意味着使用数据存储。

如果要索引大型表上的每一列,那么保留索引所需的存储空间将远远超过表本身的大小。

索引结构的自我维护也意味着无论何时发生Example,索引都必须更新(它自动完成并且不需要您的操作),但这会花费时间,这意味着这些操作执行得更慢。

有些情况下,当您需要检索大部分表(例如90%的行将在输出中)或整个表时,在这种情况下,整个表的序列扫描(没有索引的行为)会更多比执行树遍历和叶节点链(这是导航索引树结构的行为)更有效。


2
投票

我们不使用索引作为默认值的主要原因是维护问题。即,当我们通常更新(插入,删除或更新)在表中索引的特定列时,必须动态更新索引,这是一个耗时的过程。此外,维护此索引会成为开销。


-4
投票

取决于你如何获得索引,但实际上它们是每个表行的唯一标识符,通常增加一个值,例如:

UPDATE, INSERT, DELETE

看看我们如何检查“sam”的数字3,而不是每行和每列检查每个表格。

© www.soinside.com 2019 - 2024. All rights reserved.