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