哪些列通常能够创建好的索引?

作为“什么是索引,以及如何使用它们来优化数据库中的查询?”的后续操作? 我在哪里试图了解索引,哪些列是良好的索引候选者? 特别是对于MS SQL数据库?

一些谷歌搜索后,我所读的一切表明,通常增加和独特的列会创建一个好的索引(像MySQL的auto_increment之类的东西),我理解这一点,但我使用的是MS SQL,而且我正在使用GUID作为主键,该索引不会使GUID列受益...


索引可以在查询优化中发挥重要作用,并从表中快速搜索结果。 因此,选择要索引的列是最重要的一步。 有两个主要的地方我们可以考虑索引:WHERE子句中引用的列和JOIN子句中使用的列。 简而言之,应对这些列进行索引,以便搜索特定记录。 假设,我们有一个名为买家的表,其中SELECT查询使用如下所示的索引:

SELECT
 buyer_id /* no need to index */
FROM buyers
WHERE first_name='Tariq' /* consider to use index */
AND last_name='Iqbal'   /* consider to use index */

由于在SELECT部分​​中引用了“buyer_id”,因此MySQL不会使用它来限制所选行。 因此,没有很大的需要索引它。 下面是另一个与以上不同的例子:

SELECT
 buyers.buyer_id, /* no need to index */
 country.name    /* no need to index */
FROM buyers LEFT JOIN country
ON buyers.country_id=country.country_id /* consider to use index */
WHERE
 first_name='Tariq' /* consider to use index */
AND
 last_name='Iqbal' /* consider to use index */

根据上述查询first_name,last_name列可以按照位于WHERE子句中的顺序进行索引。 另外来自国家/地区表的country_id字段可用于索引,因为它位于JOIN子句中。 因此,可以在WHERE子句或JOIN子句的每个字段上考虑索引。

以下列表还提供了一些提示,在打算在表中创建索引时应始终记住:

  • 只索引那些在WHERE和ORDER BY子句中所需的列。 大量索引列会导致一些缺点。
  • 尝试利用MySQL的“索引前缀”或“多列索引”功能。 如果您创建索引(如INDEX(first_name,last_name)),则不要创建INDEX(first_name)。 但是,不建议在所有搜索情况下使用“索引前缀”或“多列索引”。
  • 对于那些您认为是索引的列使用NOT NULL属性,这样就不会存储NULL值。
  • 使用--log-long-format选项记录不使用索引的查询。 通过这种方式,您可以检查此日志文件并相应地调整您的查询。
  • EXPLAIN语句可以帮助您揭示MySQL如何执行查询。 它显示了表格的连接方式和顺序。 这对确定如何编写优化查询以及是否需要对列进行索引非常有用。
  • 更新(15年2月23日):

    任何索引(好/坏)都会增加插入和更新时间。

    根据您的索引(索引和类型的数量),搜索结果。 如果你的搜索时间会因为索引而增加,那么这就是糟糕的索引。

    可能在任何一本书中,“索引页”都可能有章节起始页,主题页码开始,子主题页也开始。 索引页面中的一些说明有助于更详细的索引,但可能会让您感到困惑或者吓到你。 索引也有记忆。

    指数选择应该明智。 请记住,并非所有列都需要索引。


    有些人在这里回答了类似的问题:你怎么知道一个好的指数是什么?

    基本上,这取决于你将如何查询你的数据。 您需要一个能够快速识别与查询相关的数据集的小部分子集的索引。 如果你从不用datestamp查询,你不需要索引,即使它大多是唯一的。 如果你所做的只是获得某个日期范围内发生的事件,那么你肯定会想要一个事件。 在大多数情况下,性别指数是毫无意义的 - 但如果你所做的只是获得有关所有男性的统计数据,并且分开了解所有女性的数据,则可能值得创建一个。 弄清楚你的查询模式将是什么,访问哪个参数会最大限度地缩小搜索空间,这是你最好的索引。

    还要考虑你所做的索引类型 - B树对于大多数情况都很好,并且允许范围查询,但是散列索引可以让你直接点(但不允许范围)。 其他类型的指标有其他优点和缺点。

    祝你好运!


    这一切都取决于你期望询问表格的问题。 如果您要求X列中具有特定值的所有行,则如果索引无法使用,则必须执行全表扫描。

    在以下情况下,索引将很有用:

  • 该列或多列具有高度的唯一性
  • 您经常需要查找列的某个值或某个值的范围。
  • 在以下情况下它们将不会有用:

  • 您正在选择表格中大量的行(> 10-20%)
  • 额外的空间使用是一个问题
  • 您想要最大化插入性能。 表中的每个索引都会降低插入和更新性能,因为每次数据更改时都必须更新它们。
  • 主键列通常适用于索引,因为它们是唯一的,并且通常用于查找行。

    链接地址: http://www.djcxy.com/p/39369.html

    上一篇: What columns generally make good indexes?

    下一篇: How do I index a database column