【问题标题】:Does adding an index on the column you are selecting speed up the query?在您选择的列上添加索引会加快查询速度吗?
【发布时间】:2018-02-18 17:51:21
【问题描述】:

我有一个相当常见的设置,我有一个标签和记录对表。查询速度很慢,因此向我正在查询的标签列添加索引有助于加快速度。

标签 |地点 123 | 456 第789章101

我的问题是在这两个列上添加一个索引作为一个索引是否有益。它永远不会被网站选中,那么这样做有什么好处吗?如果不进行一些更改,我也不能保证每个配对都是唯一的,但如果我这样做了,这对性能有帮助吗?

一个典型的查询可能如下所示:

选择 site, tag FROM sitetags WHERE tag ='123' 或 tag = '789'

【问题讨论】:

  • 如果你有一个小表,那么索引不好,但它会降低性能,如果你有大表,那么索引是好的,它可以显着提高搜索性能。
  • 唯一约束只不过是一个索引。因此,如果您使用唯一约束将这对定义为唯一,则已经存在该对的索引。

标签: php mysql sql performance indexing


【解决方案1】:

如果您总是按tag 搜索,那么您只需要索引tag 列。

在不使用时将列添加到索引中,在插入或更新记录时引入不必要的开销,并且还会消耗更多存储空间。

但复合索引(tagsite)可能会提供额外的优化,因为 MySQL 只需读取索引即可满足您的查询(EXPLAIN 通常将此优化标记为using index)。

如果您的操作主要是读取而不是写入,那么使用复合索引可能不是一个坏主意。

如果tag 列具有高基数会更好,这意味着它们的值在每行之间很有可能不同。

但我建议你先咨询EXPLAIN输出。

【讨论】:

    【解决方案2】:

    如果这些是表中唯一存在的列,那么答案是否定的,它不会加快您的查询速度,因为无论如何它都必须处理整行。

    如果不是,那么是的,在选定列上添加索引可以加快查询速度,因为优化器将能够在不实际处理整行的情况下选择值。

    通常,您应该只索引您过滤所依据的列。我建议在您实际大量使用这种 select 格式的情况下在所选列上添加索引,如果没有,则缺点(例如插入速度慢)可以克服优点。

    注意:您的典型查询实际上应该如下所示:

    WHERE tag IN('123','789')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-19
      • 2023-01-05
      • 1970-01-01
      • 2013-07-27
      • 2011-11-16
      • 2012-05-24
      • 1970-01-01
      相关资源
      最近更新 更多