我刚刚在一个会议发言人的幻灯片中读到了这个声明,来自一个似乎知道他在说什么的人:
在MySQL中,获取列值会强制读取整行[因此有意义地获取内容是有意义的。]
所以我的问题是:这是否意味着在多列数据库表查询中,以下查询的成本完全相同?我问,因为这之前我曾经听过很多关于MySQL的事情。
查询1:
SELECT id FROM mytable WHERE flag = 1;
查询2:
SELECT * FROM mytable WHERE flag = 1;
答案 0 :(得分:4)
我猜这不对。我清楚地记得我的毕业老师告诉我们某些应用程序的性能非常糟糕的情况,因为使用了'SELECT * ...'而不是使用'SELECT id ...',例如。
也许您可以尝试在两种方式中在一系列SQL查询之前和之后运行时间戳并比较其结果。
编辑:尝试使用SELECT * FROM table
和SELECT id FROM table
的SQL小提琴(http://sqlfiddle.com/#!2/32954/2)上的简单架构,'*'的平均时间约为对于95行,10 ms,对于相同的95行,'id'的平均时间为1 ms。我不知道SQL Fiddle是否是值得信赖的来源,但我认为它可以给我们一个想法。
答案 1 :(得分:1)
当我们讨论光盘操作时,这是关于MS SQL
的正确信息。
一个简单的选择包括一个简单的标识符读取多行。
IMHO MSSQL DB Fetch
操作将8页(512kb?)的数据读入数据库缓存。这就是为什么包含数据或使用随后的自然增长标识符读取数据的聚簇索引如此强大的原因。数据库在第一次光盘提取中将几行读入缓存,如果跟随选择命中,则不必转到硬盘。
请注意,
之间肯定存在差异SELECT * FROM ...
和
SELECT ID FROM ...
服务器不必序列化所有属性,网络传输也需要时间,客户端反序列化也是如此。