|
|
1
5
根据最佳实践,您不必在定义表示意图时创建索引。在应用程序中创建查询时,最好创建索引。在大多数情况下,您将从满足查询的单列索引开始。如果要在查询中使用多个列,可以创建覆盖索引。 覆盖索引是包含两列或多列的索引。如果索引满足查询的所有列要求,那么存储引擎可以从索引中获取所有结果,而不是启动磁盘I/O操作。因此,在创建使用更多列的查询时,可以创建覆盖所有必需列的新索引,也可以扩展现有索引以包含更多列。 在进行上述任何一项操作时,您必须考虑一些因素。只有当索引的最左边的列可以在查询中使用时,MySQL才会考虑索引。否则,它只需查找整个表以获取结果。因此,如果您可以在不影响所有使用该索引的查询的情况下扩展现有索引,那么这将是一个明智的选择。否则,您可以继续为新查询创建一个新索引。有时,可以调整查询以适应索引结构。 |
|
|
2
3
索引加速选择,但减慢插入和更新。您不需要为您能想象到的每种列组合创建索引。我通常只是创建一些明显的索引,我知道我会经常使用这些索引,并且只有当我看到在进行性能度量之后需要它们时,才会添加更多的索引。即使数据库没有覆盖查询中的所有列,它仍然可以使用索引。 |
|
|
3
3
查询中只能使用一个索引。幸运的是,您可以创建一个覆盖多个列的索引:
如果按小部件名称选择,将使用上述索引 或 小工具名称+小工具价格(但不只是小工具价格)。 正如Mitmaro指出的,在查询中使用explain来查看MySQL必须从哪些索引中进行选择,以及最终使用什么索引。参见 here 更多细节。 |
|
|
developer · 带外键的SQL表设计 1 年前 |
|
|
relatively_random · 确保两个表之间一致的共同参考 1 年前 |
|
|
b126 · 在两种不同的Oracle模式上执行相同查询的速度差异很大 2 年前 |
|
|
robertspierre · 在多对多关系中自动删除未引用的行 2 年前 |
|
|
Michael Samuel · MYSQL在以下情况下自动创建索引 8 年前 |