如果您的查询之一将使用 SELECT *
,我想知道是否有必要为表中的所有字段创建索引。
解释一下,如果我们有一个 10M 记录的表,并且我们对其执行了一个 SELECT *
查询,如果我们为表中的所有字段创建了一个索引,或者 MySQL以不同于 SELECT first_field, a_field, last_field
的方式处理 SELECT *
。
据我了解,如果我有一个执行 SELECT first_field, a_field FROM table
的查询,那么如果我们在 first_field, a_field
上创建索引,将会带来性能优势,但是如果我们使用 SELECT *
为所有字段创建索引是否有好处?
最佳答案
执行SELECT * FROM mytable
查询必须从表中读取所有 数据。从理论上讲,如果您在所有列上都有索引,这可以通过索引完成,但数据库读取表本身会更快。
如果您有一个 where
子句,在您有条件的(某些)列上建立索引可能会显着提高查询的性能。这是一个粗略的简化,但基本上发生的情况如下:
- 根据
where
子句过滤适当的行。在索引(本质上是排序树)中搜索这些行比在表(无序行集)中搜索要快得多。 - 对于在上一步中使用的索引中返回值的列。
- 对于不存在的列,访问表(根据索引中保存的指针)。
关于MySQL - SELECT * 是否需要所有表字段的索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32164129/