2011-07-16 34 views
0

可能重复:
Performance issue in using SELECT * ?
What is the reason not to use select *?在MySQL中使用SELECT *有什么潜在的负面影响?

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

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

+0

[点击这里查看上述问题的答案] [1] [1]:http://stackoverflow.com/questions/321299/what-is-the-reason-not-to -use-select – K6t

回答

1

存在使用select *的问题列表。

1 - 输出
如果您的客户希望某些字段,并更改了表的布局的一致性,select *会改变,如果底层表改变其输出,破坏你的客户端代码。

2 - 网络性能
如果你只需要输出中的所有领域的一个子集,select *将通过跨网发送不需要的数据浪费网络带宽。

3A - 数据库性能
在简单的表格select *可能不降低性能,但如果你有BLOB字段(即你不感兴趣)select *将获取那些为好,查杀性能

3B - 数据库服务器
如果MySQL需要使用临时表的内存使用情况,select *将征税服务器,磁盘,内存和CPU通过使MySQL的存储在内存中更多的数据额外费用。

3C - 在InnoDB上覆盖索引不能用于
在InnoDB的,如果你选择被索引的字段,MySQL需要从来没有读取实际表中的数据,它只是从索引读取信息直,select *杀这优化。

4 - 代码
select *清晰给人一种查询没有资料上的字段将被从服务器检索的读者。 select name, address, telephone from ...可以立即清楚我们正在处理的数据。
如果你的表是在祖鲁语,你甚至可以做

select 
    igama as name 
    ikheli as address 
    .... 

这比不讲祖鲁人的99.7%,原来的名字更加有用。

5 - 不要破解代码,工艺也
选择*仅仅是一个快速的黑客攻击,使东西的工作。
但是,当你编写代码时,你应该知道你在做什么,明确地说明,选择你需要的,如果需要的话,使用别名给字段赋予有意义的名字。
调整你的代码,只选择你所需要的。
如果我在代码审查中看到select *,我将它标记为看不见,因为它是一种代码异味。

希望这会有所帮助。

+0

谢谢,最彻底的答案。 – tjbp

1

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

  • 意向:你的程序应该大概知道哪些列你取
  • 性能:为什么从MySQL传输到你的程序你列不需要?这只是扼杀了带宽。

如果您知道您需要所有列,您符合上述两个标准。 这里没有任何魔法,只是好的软件开发。

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

1

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

我公司的编码风格需要完整的语句,主要是出于这个原因。 INSERT INTO必须包含一列列,SELECT *是禁止的,所以例如GROUP BY 1或ORDER BY 1.

相关问题