MySQL - SELECT * 是否需要所有表字段的索引?

标签 mysql select indexing

如果您的查询之一将使用 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 子句,在您有条件的(某些)列上建立索引可能会显着提高查询的性能。这是一个粗略的简化,但基本上发生的情况如下:

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

关于MySQL - SELECT * 是否需要所有表字段的索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32164129/

相关文章:

php - 如何从mysql编码的字符串中获取相关结果

mysql - 从mysql中的大表中快速选择随机行

sql - psql max group by 仅针对某些列

MySQL多态连接条件与OR不使用索引

mysql - 如何在where子句中使用case

php - 选择适当的行——或者获取默认行

mysql - 如何获得相对于同一表中另一列的不同值的列的不同计数?

mysql - 如何只获取mysql SELECT语句的前几条匹配

mysql - 奇怪的行为 : less rows are scanned without index on the columns in where condition

solr - 如何在 SOLR DIH HTTP API 中强制中止数据导入