有关SQL优化的问题

时间:2011-05-10 10:57:56

标签: sql database

这可能是一个愚蠢的问题,但我只想说清楚。如果每行中有大量数据,是否需要更长的时间来执行SQL查询?

例如,如果我喜欢将2000字节的数据存储为blob(我们称之为colum“Data”)在一行包含10 000行的表中(所有这些都与blob大小相似)数据的”) 。如果我只搜索一行的ID,那么是否需要更长的时间来处理搜索,例如服务器是否必须喜欢处理存储在它经过的每一行的每个列中的整个信息?

4 个答案:

答案 0 :(得分:4)

这取决于您使用的引擎。

但是,大多数现代引擎都能够存储行中的长数据:需要在搜索中扫描的实际行表只存储指向长数据的实际块的指针。

此外,如果堆表中的id上有索引,则索引将用于搜索。索引记录仅存储id和记录指针的值。即使表是聚类的(记录本身按id排序),然后B-Tree搜索算法将用于查找您所追踪的记录,仅处理最终叶中的实际记录级别页面。

因此,最有可能的是,如果您搜索id,则不会扫描长数据。

如果您的数据存储在行中并且没有在您要搜索的表达式上定义索引,那么是的,引擎需要扫描更多的记录,如果它们很大则会更慢。

答案 1 :(得分:4)

通常,如果您的ID列是表中的主键(或者至少有一个索引),那么像

这样的简单查询
SELECT ID,Data FROM Table WHERE ID = 1
无论数据列的大小

都会一样快

答案 2 :(得分:1)

  

如果每行中都有大量数据,是否需要更长时间才能执行SQL查询?

在纸面上,是的。磁盘页面读取包含较少的行,因此您需要更多IO来提取您正在寻找的行。

实际上,根据数据库存储内容的方式,开销很小。例如,PostgreSQL区分了可变长度数据的普通存储和扩展存储,例如冗长的varchar,text或bytea。

答案 3 :(得分:0)

通常,有两件事会决定您的查询速度:

  • 找到指定的记录需要多长时间?如果您正在使用ID进行搜索,Quassnoi和Justin所说的内容都是正确的 - 假设您的ID是一个与其关联的索引的主键。
  • 检索与此记录关联的数据并将其推出数据库需要多长时间?在这种情况下,数据类型确实很重要 - 并且BLOB的性能声誉比“本机”数据类型(如整数或varchars)更差。您还需要考虑将blob转换为客户端的实际类型。

对于单个记录,这应该是一个微小的开销;如果您需要检索大量数据,可能会更慢。

您的数据库引擎应该有关于BLOB性能的详细文档。