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

时间:2015-08-23 07:10:46

标签: mysql select indexing

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

要解释一下,如果我们有一个10M记录的表并且我们对它进行了SELECT *查询,那么如果我们为表中的所有字段创建索引或者MySQL处理{{1以与SELECT *不同的方式。

根据我的理解,如果我的查询有SELECT first_field, a_field, last_field,那么如果我们在SELECT first_field, a_field FROM table上创建索引会带来性能优势但是如果我们使用first_field, a_field则会带来好处从为所有字段创建索引?

3 个答案:

答案 0 :(得分:2)

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

如果你有一个where子句,那么在你有条件的列上(某些列)有索引可能会显着提高查询的性能。这是一个严格的简化,但基本上发生的是以下内容:

  1. 根据where子句筛选相应的行。在索引(实际上是一个排序树)中搜索这些行比在表(它是一组无序行)中搜索这些行要快得多。
  2. 对于上一步中使用的索引所在的列,将返回值。
  3. 对于不是的列,访问该表(根据索引中保存的指针)。

答案 1 :(得分:1)

当需要根据该表的该列搜索或编辑行/记录时,

索引列的mysql表可以提高性能。

例如,如果有一个' id'列,如果它是主键;在这种情况下,如果你想使用where' id'中的where子句搜索记录。然后,您不需要为&id; id'创建索引。列,因为主键列将充当索引列。

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

答案 2 :(得分:0)

由于sql index仅用于加快记录中匹配字段的搜索,因此可以推断出,仅用于输出的索引字段在执行记录操作时只会浪费磁盘空间和处理时间。插入或删除操作,因此应避免。同样,鉴于二进制搜索的性质,数据的基数或唯一性也很重要。在基数为2的字段上建立索引会将数据分成两半,而基数为1,000的索引将返回大约1,000条记录。由于基数如此之低,有效性降低到了线性排序,并且如果基数小于记录数的30%,查询优化器将避免使用索引,有效地使索引浪费空间

您可以看到more about sql indexing here