在MySQL中使用SELECT *有什么潜在的负面影响?

时间:2011-07-16 11:49:48

标签: mysql performance security standards

  

可能重复:
  Performance issue in using SELECT * ?
  What is the reason not to use select *?

我记得前一段时间读过一篇博客,说明使用星号来选择MySQL中表格的所有列的详细性能问题,我再也找不到了。我正在使用MySQL和PHP的PDO驱动程序(因此准备好的语句)的组合,星号自然会加速我的许多SQL查询的维护。

您认为使用星号是否可以接受?如果没有,你有什么理由(安全/性能/标准明智)?

3 个答案:

答案 0 :(得分:1)

命名列而不是使用*的要点是:

  • 意向性:您的程序可能应该知道您要提取的列
  • 性能:为什么从mySql传输到您不需要的程序列?这只会消耗带宽。

如果您知道需要所有列,则符合上述两个条件。 这里没什么了不起的,只是很好的软件开发。

但是,请记住,在编写程序后,表格模式可能会发生变化。如果发生这种情况,您使用*会开始打破意向性标准。

答案 1 :(得分:1)

比表现更重要的是清晰度。在某些源代码中读取SELECT *之类的语句绝对没有任何信息。要找出该查询的结果包含哪些列,我必须查看数据库文档(如果存在的话)或者必须查看数据库本身。

我公司的编码风格要求完整陈述,主要是出于这个原因。 INSERT INTO必须包含列列表,SELECT *是禁止的,因此例如GROUP BY 1或ORDER BY 1。

答案 2 :(得分:1)

使用select *时会出现一系列问题。

1 - 输出的一致性
如果您的客户端需要某些字段并且您更改了表的布局,那么select *将在基础表发生更改时更改其输出,从而破坏您的客户端代码。

2 - 网络效果
如果您只需要输出中所有字段的子集,select *将通过线路发送不需要的数据来浪费网络带宽。

3a - 数据库性能
在简单的表上select * 可能不会降低性能,但如果你有blob字段(你不感兴趣),select *也会获取这些字段,从而消除性能< / p>

3b - 数据库服务器上的内存使用情况
如果MySQL需要使用临时表,select *会使MySQL在内存中存储更多数据,从而对服务器,磁盘,内存和CPU产生额外的负担。

3c - 在InnoDB上覆盖索引不能使用
在InnoDB上,如果你选择被索引的字段,MySQL就不需要读取实际的表数据,它只是直接从索引中读取信息,select *会导致这种优化。

4 - 代码清晰度
select *为查询的读者提供了关于将从服务器检索哪些字段的信息。 select name, address, telephone from ...可以立即清楚我们正在处理的数据 如果你的桌子在Zulu,你甚至可以做

select
  igama as name
  ikheli as address
  ....

对于99.7%不会说祖鲁语的人来说,这比原来的名字更有用。

5 - 不要破解代码,制作代码
选择*只是一个快速破解,使东西工作 但是当你编写代码时,你应该知道你正在做什么,明确说明,选择你需要的东西,如果需要,使用别名给字段有意义的名字。
调整您的代码,只选择您需要的内容 如果我在代码审核中看到select *,我会看不到它,因为这是代码味道。

希望这有帮助。