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