select * from table where something VS select column from table where something

Posted

技术标签:

【中文标题】select * from table where something VS select column from table where something【英文标题】: 【发布时间】:2014-11-15 09:28:47 【问题描述】:

我想知道两者之间的性能是否存在显着差异

select * from table where something

select column from table where something

【问题讨论】:

Select * sql query vs Select specific columns sql query 的可能重复项 Why is SELECT * considered harmful?的可能重复 抱歉重复,谢谢大家。 对于那些想要更有表现力的答案的人,这里是explanation - 请参阅摘要。 到目前为止我没有看到的(即使是重复的)提到了存储和执行模型。 mysql 是一个行存储:它在内部处理整个行,而不管它们在查询中的实际使用情况。因此可能存在差异,但与您在列存储引擎中发现的差异相比,差异相当微不足道,其中仅涉及实际使用的列。 【参考方案1】:
SELECT * FROM table WHERE something

将检索该表中的所有列

SELECT column FROM table WHERE something

只会检索该列。

这意味着后者会更快。但如果这将是一个显着的差异取决于你的桌子大小。

您可以阅读this 对类似问题的回答以了解更多信息

【讨论】:

【参考方案2】:

是的,存在性能差异。

SELECT * FROM someTable WHERE something

相比会更重
SELECT column FROM someTable WHERE something

因为第一个必须处理所有列,而第二个必须只处理一个。你应该总是更喜欢第二个。

更多详情,我会推荐你​​What is the reason not to use select *?

【讨论】:

【参考方案3】:

这是我为比较 SELECT * 与 SELECTing 单个列所做的一个小基准。这是一个简化的代码,循环中有 100 次迭代,在我的测试中,我只查询了我需要的内容,34 列中有 25 列,vs SELECT *

结果:SELECT * 平均需要 4.8 秒才能完成,而 SELECT 单个列需要 3.2 秒!这是非常重要的。所以确实 SELECT * 慢得多。然而,在一个有 4 列的表的较小查询中,选择 all vs * 给出了几乎相同的基准。所以在我的测试中,SELECT * 会对来自具有大量列的大表的复杂查询产生性能影响。

$start_time = microtime(true);
for ($x = 0; $x < 100; $x++) 
$results = $dbp->multi(
      "SELECT t1.id, t1.name, t2.field, t2.something, t2.somethingelse "
      . "FROM table1name t1 INNER JOIN table2name t2 ON t2.id = t1.id "
      . "ORDER BY title ASC LIMIT 1, 50");

$ms = (number_format(microtime(true) - $start_time, 4) * 1000);
$end_time_sec = floor($ms / 60000) . 'm:' . floor(($ms % 60000) / 1000) . 's:' . str_pad(floor($ms % 1000), 3, '0', STR_PAD_LEFT) . 'ms';
echo "$ms ms / $end_time_sec";

【讨论】:

以上是关于select * from table where something VS select column from table where something的主要内容,如果未能解决你的问题,请参考以下文章

Select into Table from Table2 where column in (Subquery)

select * from [table] where min(date) > 某个日期

INSERT <table> (x) VALUES (@x) WHERE NOT EXISTS ( SELECT * FROM <table> WHERE x = @x) 会导

sql 代码:SELECT * FROM table WHERE 列

SELECT * FROM table WHERE column = 1,2,3,4 [重复]

Select into Table from Table2 where column in (Subquer)