为什么以及在哪里使用INDEX - 优点和缺点

Jho*_*nda 12 mysql sql indexing select

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

考虑这个例子:

对于表Example,在列上有索引user_name,操作:

SELECT TestField FROM Example WHERE user_name=XXXX
Run Code Online (Sandbox Code Playgroud)

由于索引会更快.

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

小智 28

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

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

例如,如果您使用MySQL,您可以检查,如果enginge通过在选择之前添加"explain"来使用索引 - 对于您的上述示例 EXPLAIN SELECT TestField FROM Example WHERE username=XXXX


Kam*_*ski 12

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

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

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

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

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

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

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

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

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

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