推荐方式:“SELECT *”与“SELECT COLUMN_LIST”来自同一个表,多次

lea*_*ner 7 mysql select query-performance

这个问题非常接近我想问的问题,但问题和答案都更侧重于选择随机行。

由于一般规则是始终推荐“SELECT COLUMN_LIST”而不是“SELECT *”,我想知道推荐是否随以下场景而变化。

场景: 从一个大约有 5 列的表中,如果我需要这 5 列的信息,但在不同的步骤,

例如:就像在 Java 函数中一样,在第 1 步中,将使用前 2 列,在第 4 步中,将使用第 3 列和第 4 列,在第 10 步中将使用第 5 列。

有两种方法可以获取这些信息,

  1. 使用“SELECT *”进行 1 次数据库调用,并在相应步骤中提取所需信息。
  2. 进行多次数据库调用,在步骤 1、步骤 4 和步骤 10 中使用“SELECT COLUMN_LIST”,在每次调用中仅获取所需列的数据。

对于上述场景,推荐使用 2 种方式中的哪一种?

J.D*_*.D. 18

有你忘了提,做出了第三种选择一个数据库调用,用SELECT COLUMN_LIST。我提到这一点的原因是因为何时使用SELECT *vs 的SELECT COLUMN_LIST比较并不是关于一个人进行了多少数据库调用,而是关于模式一致性

究其原因SELECT *,建议反对是因为数据集的模式你要选择的是容易随时间变化,这可能会导致意想不到的结果和错误,特别是在你的应用为消费者它总是期望Column1Column1,并且Column3是第三列等。

即使未来的架构更改不会破坏应用程序,您仍然可能会遇到性能问题以及使用SELECT *,原因有两个。一个是可能在数据集的末尾添加了额外的列,您现在不必要地为其带回额外的数据。第二个原因是您可能会导致生成一个不太理想的查询计划(例如,通常可以搜索的索引现在可能不适用)。

最重要的是,正如前面评论中提到的,与使用SELECT *. 这是因为它明确地传达了正在使用数据库中的哪些字段并帮助建立代码的意图,特别是对于可能无法访问数据库本身的开发人员。

还有许多其他原因,但这些是我想到的几个重要原因。相反,有一些边缘情况可以使用SELECT *而不是显式列列表,您可以在我在这里提出的类似问题中找到其中一些示例。