【问题标题】:MySQL - Does SELECT * need an index of all table fields?MySQL - SELECT * 是否需要所有表字段的索引?
【发布时间】:2015-11-16 19:17:46
【问题描述】:

如果您的查询之一将使用SELECT *,我想知道是否有必要为表中的所有字段创建索引。

解释一下,如果我们有一个有 10M 记录的表,并且我们对其进行了 SELECT * 查询,如果我们为表中的所有字段创建了索引,或者 MySQL 是否在与SELECT first_field, a_field, last_field 不同的方式。

据我了解,如果我有一个执行 SELECT first_field, a_field FROM table 的查询,那么如果我们在 first_field, a_field 上创建索引,它会带来性能优势,但如果我们使用 SELECT *,那么为所有人创建索引是否会带来好处字段?

【问题讨论】:

  • 没关系。最有可能确定使用的索引的是 WHERE 子句
  • @krock 感谢您的反馈,但这让我更加困惑。我一直认为,如果我们在 mysql 中查询一个字段,那么该字段上也应该存在一个索引。您是说索引用于 WHERE 子句中的值而不是 SELECT 子句? :o
  • 查看this question。答案中说:“索引用于加快在数据库中的搜索”。索引可以加快搜索速度——而不是检索列值。
  • @krock 现在开始变得有意义了。所以,我实际上应该索引 WHERE 子句中的值,而不是正在检索的值。有道理,因为这会加快计算/寻求部分。

标签: mysql select indexing


【解决方案1】:

执行SELECT * FROM mytable 查询必须从表中读取所有数据。理论上,如果您对所有列都有索引,这可以从索引中完成,但数据库读取表本身会更快。

如果您有一个where 子句,则在您有条件的(某些)列上建立索引可能会显着提高查询的性能。这是一个粗略的简化,但基本上发生的情况如下:

  1. 根据where 子句过滤适当的行。在索引(本质上是一个排序的树)中搜索这些行比在表(它是一组无序的行)中搜索要快得多。
  2. 对于在上一步中使用的索引中返回值的列。
  3. 对于不存在的列,将访问表(根据索引中保存的指针)。

【讨论】:

  • 这是一个专业提示,非常感谢!因此,这就像尝试进行搜索一样,它会 1、2 跳过一些、43、72、100,但是如果您索引数据,它将按这些值排序,因此所需的值将是 1-23 和那里之后还有什么好担心的吗?
  • 再澄清一下,索引返回信息的速度似乎比数据库本身慢,所以在索引中包含选择信息和位置信息不是很好吗?但是,对于您的第 3 点,如果它在第 2 点存在并且它知道要返回什么值,那么为什么去查询数据库以返回与查询相关的其他值会更快。似乎是系统中的一个问题? :)
  • @IndigoIdentity 我不明白你的问题 - 索引是数据库的一部分。
  • 简单地说,你说在索引中的行是根据 where 子句排序的,这是有道理的。但是考虑到这一点,如果它们已经以最佳方式排序,为什么不包括 SELECT 子句中的值,以便此时它能够返回此信息而无需继续执行第 3 步?
  • 这里需要权衡取舍——添加到索引中的列越多,它就会变得越大,搜索速度就越慢。如果附加列不是太大,将它们添加到索引并在步骤 3 中保存表访问权限确实是一个好主意(甚至是一种常见做法!)。如果它是一个大列表列,添加到过滤步骤 (2) 的额外成本不值得。
【解决方案2】:

当需要基于该表的该列搜索或编辑行/记录时,为列索引 mysql 表可以提高性能。

例如,如果有一个“id”列并且它是一个主键;在这种情况下,如果您想在“id”列上使用 where 子句搜索记录,那么您不需要为“id”列创建索引,因为主键列将充当索引列。

在另一种情况下,如果表中有'pid'列并且它不是主键;然后为了基于“pid”列进行搜索,然后为了提​​高性能,最好为“pid”列创建索引。这将使查询快速搜索预期的记录。

【讨论】:

  • 感谢您的意见和反馈!问题,这是否意味着主键将始终包含在索引中?因此,如果我根据 pid 在哪里搜索,我不需要包含 id/key,因为它已经包含在内?所以索引不会是 id, pid 而只是 pid?
  • 如果 'id' 列是主键并使用 select * from table where id=1,则不需要为 'id' 列创建索引。如果使用 select * from table where pid=2 并且它不是主键列,那么为了使查询更快,您可以为“pid”列创建索引
猜你喜欢
  • 1970-01-01
  • 2012-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-24
  • 1970-01-01
  • 2011-03-03
  • 2014-08-10
相关资源
最近更新 更多