自从我18个月前开始从事科技工作以来,我听说过他们。我知道它们可能会提高性能,而且它们似乎是特定于列的 - (“我们在date_of_birth列上索引User表”)。
只是想快速了解它们究竟是什么,它们的用途以及它们的工作原理。
答案 0 :(得分:74)
我写了一本关于它的完整书!它也可以在网上免费获得:http://use-the-index-luke.com/
我很快就会回答你的问题 - 这不是我擅长的问题。我最后一次尝试,最后写了一本书......
与表类似,索引由行和列组成,但以逻辑排序的方式存储数据以提高搜索性能。可以把它想象成电话簿(印刷品)。它们通常按last_name
,first_name
和其他可能的标准(例如邮政编码)进行排序。通过此排序,可以快速查找特定姓氏的所有条目。如果您也知道名字,您甚至可以很快找到组合姓氏/名字的条目。
但是,如果您只知道名字,那么电话簿并不能真正帮到您。多列数据库索引也是如此。所以是的,索引可以可能提高搜索性能。如果您的问题索引错误(例如,使用名字搜索电话簿),则可能无用。
您可以在同一个表上但在不同的列上拥有多个索引。因此,last_name
,first_name
上的索引与first_name
上的索引不同(您需要按名字优化搜索)。
索引包含冗余数据(例如:clustered indexes =电话簿)。它们具有与表中存储的相同的信息(例如:function based indexes),但是以排序的方式。对于您执行的每个写操作,数据库会自动维护此冗余(insert/update/delete)。因此,索引降低写入性能。
除了快速查找数据外,索引还可用于优化sort operations(order by
)并将相关数据紧密地排列在一起(clustering)。
要获得更好的主意,请查看我的图书的完整目录:http://use-the-index-luke.com/sql/table-of-contents
答案 1 :(得分:11)
将其视为表格的目录。如果它在那里,数据库知道在哪里看起来更具体。如果不存在,数据库必须搜索所有数据才能找到它。
可以找到更详细的解释here in this Wikipedia article。
答案 2 :(得分:10)
数据库索引是旨在提高查找操作的时间复杂度的数据结构。
没有索引的查找最坏情况O(N)
复杂度。使用索引进行高效查找可以实现对数O(log(N))
,甚至可以使用一些架构O(1)
复杂度。
数据库索引还可以强制执行数据库约束。许多数据库系统在称为PRIMARY KEY
的一组列上设置索引。某些数据库系统需要对FOREIGN KEY
中的列进行索引,以便加快操作(插入,更新)。
答案 3 :(得分:6)
索引是一个与表或表集群相关联的可选结构,有时可以加速数据访问。通过在表的一列或多列上创建索引,您可以在某些情况下从表中检索一小组随机分布的行。索引是减少磁盘I / O的众多方法之一。
如果堆组织表没有索引,则数据库必须执行全表扫描才能查找值。例如,如果没有索引,hr.departments表中的位置2700的查询要求数据库搜索每个表块中的每一行以获取该值。随着数据量的增加,这种方法不能很好地扩展。
http://docs.oracle.com/cd/E11882_01/server.112/e10713/indexiot.htm
答案 4 :(得分:5)
它有一个非常相似的运行here的线程。检查,这很有帮助。
我知道它们可能会提高性能
是的,这是真的。但是,请记住,有时索引也可能是 POOR Performance 的原因。 示例:索引数据库的所有列无疑会严重影响性能。