【问题标题】:Why and where to use INDEXes - pros and cons为什么以及在哪里使用索引 - 优点和缺点
【发布时间】:2015-07-02 18:29:40
【问题描述】:

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

考虑这个例子:

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

SELECT TestField FROM Example WHERE user_name=XXXX

索引会更快。

我的问题是:使用索引有什么缺点?如果索引只是给我们带来好处(性能提升),为什么不将它们设置为默认值?

【问题讨论】:

标签: mysql sql select indexing


【解决方案1】:

取决于您如何拥有索引,但本质上它们是每个表行的唯一标识符,通常递增一个值,例如:

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”,而不是遍历每个表的每一行和每一列..

【讨论】:

  • 请说明这是如何回答问题的?
  • 我提供了一套快速的基础知识,请查看 Stefan P 的答案:)
【解决方案2】:

好吧,您可能可以填写有关索引的书籍,但简而言之,在创建索引时需要考虑以下几点:

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

例如,如果您使用 MySQL,您可以通过在选择之前添加“解释”来检查引擎是否使用索引 - 对于您上面的示例 EXPLAIN SELECT TestField FROM Example WHERE username=XXXX

【讨论】:

    【解决方案3】:

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

    如果user_name 列没有索引,系统将不得不逐行扫描整个Example 表以查找所有匹配条目。如果特定表中的数据分布指出只有几行左右,那么这显然是获取这些行的低效方式。

    但是,在使用索引时,您将搜索的力量重定向到不同的树结构,该结构具有更快的查找速度和非常小的深度。

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

    如果您对某本书的某一章感兴趣,该索引可让您相对较快地找到它,这样您就不必浏览很多页来获得它。

    为什么默认不创建索引?

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

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

    索引结构的自我维护还意味着每当出现UPDATE, INSERT, DELETE 时,都必须更新索引(它是自动完成的,不需要您的操作),但这花费时间,这意味着这些操作执行速度较慢。

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2010-09-21
        • 2011-01-28
        • 2011-05-03
        • 2010-09-06
        • 2023-03-24
        • 1970-01-01
        • 2010-09-08
        • 1970-01-01
        • 2012-04-21
        相关资源
        最近更新 更多