2010-09-21 76 views
1

我是一名自学成才的开发人员,并且一直被告知不要使用SELECT *,但我的大多数查询都需要知道某一行的所有值...MySql查询:真的从不使用SELECT *?

我应该怎么使用?我应该每次列出所有属性吗?像Select elem1,elem2,elem3,...,elem15 FROM ...?

感谢

+0

可能的重复[什么原因不使用select *?](http://stackoverflow.com/questions/321299/what-is-the-reason-not-to-use-select) – NotMe 2010-09-21 19:34:43

+0

另外: http://stackoverflow.com/questions/128412/sql-query-question-select-from-view-or-select-col1col2from-view – NotMe 2010-09-21 19:35:12

回答

3

SELECT * FROM ...并不总是最好的方法,除非你需要所有的列。这是因为,如果一个表有10列,而你只需要2-3列,并且这些列是索引的,那么如果你使用SELECT *,查询将会运行得更慢,因为服务器必须从数据文件中获取所有行。如果您只使用实际需要的2-3列,那么如果从覆盖索引中获取行,则服务器可以更快地运行查询。覆盖索引是用于在不读取数据文件的情况下返回结果的索引。

因此,只有在实际需要所有列时才使用SELECT *。

1

只列出你所需要的,最好是使用表的别名列:

SELECT t.elem1, 
     t.elem2 
    FROM YOUR_TABLE t 

表别名的存在有助于演示什么是列(并从那里的)与一派生列。

4

如果你真的需要所有的列,并按名称获取结果,我会继续使用SELECT *。如果您通过索引获取行结果,那么指定列名是有意义的,否则它们可能不会按您期望的顺序(尤其是在表模式更改的情况下)。

+0

我从来没有需要通过索引而不是名称来获取列。我甚至无法提出一个有效的场景。 – CaffGeek 2010-09-21 19:24:44

+0

乍得,我很高兴。我当然不会选择通过名称访问进行索引访问;我只知道存在通过索引选择结果的API,而OP没有指定他用来与MySQL交谈的语言或平台。 – Nick 2010-09-21 19:25:45

+1

我不知道为什么你会这样做,但PHP的['mysql_fetch_row'](http://ca.php.net/manual/en/function.mysql-fetch-row.php)将返回一个数字索引的数组,这是一个在野外发生的例子。 – 2010-09-21 19:28:14

0

使用select *所带来的唯一真实性能是在结果集中发送额外列所需的带宽(如果不是必需的话)。除此之外,关于使用select *没有任何固有的“坏”。

+1

不正确。 http://stackoverflow.com/questions/321299/what-is-the-reason-not-to-use-select – NotMe 2010-09-21 19:34:15

+0

我被p了。 – Matt 2010-09-21 20:17:54

2

如果您绝对必须使用*,请尝试将其限制到特定表格;例如:

SELECT t.* 
    FROM mytable t 
+0

好点,连接表时我不会自己使用'*'。 – Nick 2010-09-21 19:30:29

1

如果你肯定你会总是需要所有列然后select *应该没问题。但我的理由是避免它:说另一个开发人员有另一列添加到表中,这是不需要你的查询..然后有开销。随着更多列的添加,这可能会变得更糟。

0

您可能会从子查询中获得SELECT *

0

是的,选择*是不好的。您不会说明您将使用哪种语言处理返回的数据。假设您将这些记录作为数组(而不是哈希映射)接收回来。在这种情况下,行[12]中的内容是什么?当你编写应用程序时,也许它是ZipCode,但是猜猜当有人在ZipCode之前插入字段SuiteNumber时会发生什么。

或者假设下一个编码器将巨大的blob字段附加到每个记录。哎哟!

或者更微妙一点:假设您正在进行连接或子选择,并且没有文本或Blob类型字段。 MySQL将在内存中创建它需要的任何临时文件。但是,只要包含一个文本字段(即使是TinyText),MySQL也需要在磁盘上创建临时文件,然后调用排序合并。这不会破坏程序,但它可能会导致性能下降。

选择*是牺牲可维护性,以节省一些打字。