我对数据库编程很陌生,我想知道索引的负面影响是什么?据我所知,索引加速了必须在数据库中搜索特定值的操作(例如SELECT)。
考虑这个例子:
对于表Example
,列user_name
的索引,操作:
SELECT TestField FROM Example WHERE user_name=XXXX
由于指数会更快。
我的问题是:使用索引的缺点是什么?如果一个索引只给我们专业人士(业绩增长),为什么他们没有设置为默认值?
答案 0 :(得分:20)
那么你可以填写有关索引的书籍,但总之,在创建索引时需要考虑一些事项:
虽然它(主要)加速了select,但它减慢了插入,更新和删除的速度,因为数据库引擎不必仅写入数据,而是编写索引。 索引需要RAM中的硬盘空间(更重要的是)。无法保存在RAM中的索引是没用的。 只有几个不同值的列上的索引不会加速选择,因为它不能排序很多行(例如列"性别",它通常只有两个不同的值 - 男,女)。
如果您使用MySQL作为示例,您可以检查,如果enginge使用索引通过添加"解释"在选择之前 - 对于您的上述示例User-Agent
答案 1 :(得分:10)
什么是索引,数据库中有什么?
如果没有列user_name
上的索引,系统必须逐行扫描整个Example
表,以查找所有匹配的条目。如果特定表中的数据分布指出只有几行左右,这显然是获得这些行的低效方法。
但是,在使用索引时,您将搜索功能重定向到另一个树结构,该结构具有更快的查找速度和非常小的深度。
请记住,索引是纯冗余。数据库索引就像电话簿中的一个或您可能愿意阅读的书中的任何其他索引(可能是其中的一部分,以便快速找到您正在寻找的内容)。
如果您对某本书的某一章感兴趣,该索引可以让您相对快速地找到它,这样您就不必浏览很多页面来获取它。
为什么没有在默认情况下创建索引?
索引是一种与表一起创建的数据结构,并在表更改时自行维护。它存在的事实意味着使用数据存储。
如果要为大型表上的每一列编制索引,那么保留索引所需的存储空间将超过表本身的大小。
索引结构的自我维护也意味着每当发生UPDATE, INSERT, DELETE
时,索引都必须更新(它自动完成,不需要您的操作),但需要花费时间表示这些操作执行得较慢。
有些情况下,您需要检索大部分表(例如,90%的行将在输出中)或整个表,在这种情况下,整个表的序列扫描(没有索引的行为)比使用树遍历和叶子节点链(这是导航索引树结构的行为)更有效。
答案 2 :(得分:2)
我们不使用索引作为默认值的主要原因是维护问题。 即,当我们通常更新(插入,删除或更新)在表中索引的特定列时,必须动态更新索引,这是一个耗时的过程。此外,维护此索引会成为开销。
答案 3 :(得分:-4)
取决于你如何获得索引,但实质上它们是每个表行的唯一标识符,通常递增一个值,例如:
mytable{
index | name | m/f | age
1 | bob | male | 22 |
2 | joe b | male | 27 |
3 | sam | female | 42 |
4 | bef | female | 21 |
}
了解我们如何查看#3; sam"的数字3而不是每行和每列经过每个表..