如果您的某个查询使用SELECT *
,我想知道是否有必要为表格中的所有字段创建索引。
要解释一下,如果我们有一个10M记录的表并且我们对它进行了SELECT *
查询,那么如果我们为表中的所有字段创建索引或者MySQL处理{{1以与SELECT *
不同的方式。
根据我的理解,如果我的查询有SELECT first_field, a_field, last_field
,那么如果我们在SELECT first_field, a_field FROM table
上创建索引会带来性能优势但是如果我们使用first_field, a_field
则会带来好处从为所有字段创建索引?
答案 0 :(得分:2)
执行SELECT * FROM mytable
查询必须从表中读取所有数据。理论上,如果你在所有列上都有索引,这可以从索引完成,但数据库读取表本身的速度会更快。
如果你有一个where
子句,那么在你有条件的列上(某些列)有索引可能会显着提高查询的性能。这是一个严格的简化,但基本上发生的是以下内容:
where
子句筛选相应的行。在索引(实际上是一个排序树)中搜索这些行比在表(它是一组无序行)中搜索这些行要快得多。答案 1 :(得分:1)
索引列的mysql表可以提高性能。
例如,如果有一个' id'列,如果它是主键;在这种情况下,如果你想使用where' id'中的where子句搜索记录。然后,您不需要为&id; id'创建索引。列,因为主键列将充当索引列。在另一种情况下,如果有一个' pid'表中的列,如果它不是主键;然后为了基于' pid'进行搜索然后为了提高性能,最好为“pid”创建一个索引。柱。这将使查询快速搜索预期的记录。
答案 2 :(得分:0)
由于sql index仅用于加快记录中匹配字段的搜索,因此可以推断出,仅用于输出的索引字段在执行记录操作时只会浪费磁盘空间和处理时间。插入或删除操作,因此应避免。同样,鉴于二进制搜索的性质,数据的基数或唯一性也很重要。在基数为2的字段上建立索引会将数据分成两半,而基数为1,000的索引将返回大约1,000条记录。由于基数如此之低,有效性降低到了线性排序,并且如果基数小于记录数的30%,查询优化器将避免使用索引,有效地使索引浪费空间