我正在使用PHP与MySQL数据库交互,我想知道用“SELECT * FROM ...”查询MySQL是否比“SELECT id FROM ...”效率更高或更低。
答案 0 :(得分:4)
效率低下。
如果你考虑一下,SQL会发送你选择的每一行的所有数据。
假设您有一个名为MassiveTextBlock
的列 - 当您SELECT *
时将包含此列,因此当您实际上不需要时,SQL必须发送所有这些数据。相比之下,SELECT id
只是抓取一组数字。
答案 1 :(得分:0)
它的效率较低,因为您获取的信息不仅仅是SELECT id。此外,第二个问题更有可能只使用索引来提供。
答案 2 :(得分:0)
这取决于您选择数据的原因。如果您正在编写像phpMySQL这样的原始数据库接口,那么它可能有意义。
如果您使用相同的条件和连接操作在同一个表上执行多个查询,那么SELECT col1, col2 FROM table
可能比使用两个独立SELECT col1 FROM table
和SELECT col2 FROM table
更有意义。获取相同数据的不同部分,因为它在同一查询中执行两个操作。
但是,通常,您应该只从表中选择所需的列,以便最大限度地减少DBMS疏散不必要的数据。如果您的数据库与客户端服务器位于不同的服务器上,或者您的数据库服务器已经过时和/或速度很慢,那么这种好处会大大增加。
没有条件SELECT *
是不可避免的,但如果有,那么您的数据模型可能存在一些严重的设计缺陷。
答案 3 :(得分:0)
这取决于您的索引。
如果只选择MySQL用于获取结果的索引中存在的列,则选择较少的列有时可以节省大量时间。
例如,如果您在列id
上有索引,并执行此查询:
SELECT id FROM mytable WHERE id>5
然后MySQL只需要读取索引,甚至不需要读取表行。另一方面,如果选择其他列,则为:
SELECT id, name FROM mytable WHERE id>5
然后MySQL需要从索引中读取id,然后转到表行来读取名称列。
但是,如果您正在阅读不在您正在选择的索引中的列,那么读取更多列实际上不会产生差异,尽管它会产生一些小的差异。如果某些列包含大量数据,例如大型TEXT或BLOB列,那么在不需要它们的情况下排除它们是明智的。