我是一名自学成才的开发人员,我总是被告知不要使用SELECT *,但我的大多数查询都需要知道某一行的所有值......
那我该怎么用?我应该每次列出所有属性吗?比如选择elem1,elem2,elem3,....,elem15 FROM ...?感谢
答案 0 :(得分:4)
如果您确实需要所有列,并且您按名称获取结果,我会继续使用SELECT *
。如果您通过索引获取行结果,那么指定列名称是有意义的,否则它们可能不符合您期望的顺序(特别是如果表模式更改)。
答案 1 :(得分:3)
SELECT * FROM ...并不总是最好的方法。那是因为,例如,如果一个表有10列,你只需要2-3个并且这些列被索引,那么如果使用SELECT *,查询将运行得更慢,因为服务器必须从数据文件中获取所有行。如果您只使用了实际需要的2-3列,那么如果从覆盖索引中获取行,则服务器可以更快地运行查询。覆盖索引是用于在不读取数据文件的情况下返回结果的索引。
因此,只有在实际需要所有列时才使用SELECT *。
答案 2 :(得分:2)
如果您必须使用*
,请尝试将其限制为特定的表格; e.g:
SELECT t.*
FROM mytable t
答案 3 :(得分:1)
仅列出您需要的列,最好使用表别名:
SELECT t.elem1,
t.elem2
FROM YOUR_TABLE t
表别名的存在有助于证明什么是列(以及它来自哪个列)与派生列的对比。
答案 4 :(得分:1)
如果您肯定总是需要所有列,那么select *
应该没问题。但我避免它的原因是:假设另一个开发人员在表中添加了另一个列,这是查询不需要的。然后就会有开销。随着更多列的添加,这可能会变得更糟。
答案 5 :(得分:0)
使用select *
时唯一真正的性能影响是在结果集中发送回额外列所需的带宽,如果不需要的话。除此之外,使用select *
没有任何固有的“坏”。
答案 6 :(得分:0)
您可以从子查询中SELECT *
。
答案 7 :(得分:0)
是的,选择*不好。您没有说明您将使用哪种语言处理返回的数据。假设您将这些记录作为数组(而不是哈希映射)返回。在这种情况下,Row [12]中有什么?当你编写应用程序时,可能是ZipCode,但猜猜当有人在ZipCode之前插入字段SuiteNumber时会发生什么。
或者假设下一个编码器在每条记录上附加一个巨大的blob字段。哎哟!
或者更微妙一点:让我们假设您正在进行连接或子选择,并且您没有Text或Blob类型字段。 MySQL将在内存中创建所需的任何临时文件。但是只要包含Text字段(甚至是TinyText),MySQL就需要在磁盘上创建临时文件,并调用sort-merge。这不会破坏程序,但它可以扼杀性能。
选择*会牺牲可维护性以节省一点打字。