可能重复:
Performance issue in using SELECT * ?
What is the reason not to use select *?
我记得前一段时间读过一篇博客,说明使用星号来选择MySQL中表格的所有列的详细性能问题,我再也找不到了。我正在使用MySQL和PHP的PDO驱动程序(因此准备好的语句)的组合,星号自然会加速我的许多SQL查询的维护。
您认为使用星号是否可以接受?如果没有,你有什么理由(安全/性能/标准明智)?
答案 0 :(得分:1)
命名列而不是使用*的要点是:
如果您知道需要所有列,则符合上述两个条件。 这里没什么了不起的,只是很好的软件开发。
但是,请记住,在编写程序后,表格模式可能会发生变化。如果发生这种情况,您使用*会开始打破意向性标准。
答案 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 *
,我会看不到它,因为这是代码味道。
希望这有帮助。