这是真的吗;在MySQL中,获取列值会强制读取整行;?
我刚刚在一张会议发言人幻灯片上读到了这句话,他似乎知道自己在说什么: 在MySQL中,获取列值会强制读取整行内容[因此,积极地获取其中的内容是有意义的] 所以我的问题是:这是否意味着在多列数据库表查询中,以下查询的成本完全相同?我这么问是因为这与我以前听说的MySQL几乎完全不同 查询1:这是真的吗;在MySQL中,获取列值会强制读取整行;?,mysql,database-performance,query-performance,Mysql,Database Performance,Query Performance,我刚刚在一张会议发言人幻灯片上读到了这句话,他似乎知道自己在说什么: 在MySQL中,获取列值会强制读取整行内容[因此,积极地获取其中的内容是有意义的] 所以我的问题是:这是否意味着在多列数据库表查询中,以下查询的成本完全相同?我这么问是因为这与我以前听说的MySQL几乎完全不同 查询1: SELECT id FROM mytable WHERE flag = 1; SELECT * FROM mytable WHERE flag = 1; 查询2: SELECT id FROM mytab
SELECT id FROM mytable WHERE flag = 1;
SELECT * FROM mytable WHERE flag = 1;
查询2:
SELECT id FROM mytable WHERE flag = 1;
SELECT * FROM mytable WHERE flag = 1;
我想这是不对的。我清楚地记得,我的毕业老师告诉我们,例如,某个应用程序的性能非常差,因为使用了“SELECT*…”而不是“SELECT id…” 也许您可以尝试制作一个真实的示例,以两种方式在SQL查询序列前后运行时间戳,并比较其结果
EDIT:使用
SELECT*FROM table
和SELECT id FROM table
在SQL Fiddle()上尝试一个简单的模式,对于95行,“*”模式的平均时间约为10毫秒,对于相同的95行,“*”模式的平均时间为1毫秒。我不知道SQL Fiddle是否是一个可靠的来源,但我认为它可以给我们一个想法。这是关于MS SQL
的正确信息,当我们谈论光盘操作时。
一个包含一个简单标识符的简单选择读取多行
IMHO MSSQL DBFetch
操作将8页(512kb?)的数据读取到DB缓存中。这就是为什么包含数据的聚集索引或使用自然递增标识符读取数据如此强大的原因。数据库在第一次提取光盘时将几行读到缓存中,如果下面的select命中了捕获,则不必转到硬盘
请注意,两者之间肯定存在差异
SELECT * FROM ...
及
服务器不必序列化所有属性,网络传输也需要时间,客户端反序列化也需要时间。这取决于您拥有的索引和数据分布。