从没有存储varchar或其他可变长度数据的表读取数据通常会更快吗?在MySQL中,这是更快的,因为它可以准确计算行将存储在磁盘上的位置。从SQLite中的固定宽度列读取速度更快吗?
6
A
回答
13
这个问题在SQLite的上下文中没有意义,因为它只支持单个TEXT
字段类型。这里不存在“固定宽度”与“可变长度”的区别。
尽管SQLite会让你将字段定义为具有特定类型,但所有这些都是(至多)设置该字段的首选项以便在存储模糊数据时使用的类型(例如,是否将“3”存储为INTEGER,REAL或TEXT)。您仍然可以在任何SQLite字段中存储任何类型的数据,而不管其类型。
具体涉及CHAR与VARCHAR,http://www.sqlite.org/datatype3.html告诉我们:
如果列 声明的类型包含字符串的 “CHAR”, “CLOB” 或 “TEXT” 那么列有 TEXT亲和力。请注意,类型 VARCHAR包含字符串“CHAR”,因此 被分配了TEXT关联。
5
由于SQLite uses variable-length records只,我猜他们没有实现固定宽度的查找优化,当行长度相同。
而且正如Dave指出的,人们仍然可以在INT字段中存储文本。由于SQLite never truncates data,这意味着SQLite允许像INT一样固定宽度的列来存储可变长度的数据。所以不可能实现固定宽度的查找优化。
但我也可以从表中删除所有text/varchar/char列。这将是固定的宽度。我的问题是这样做是否能够更快地搜索列(除了它只是很小)。 – David 2010-12-14 12:24:22
不,它不会。正如链接文档所解释的,SQLite使用动态字段类型。即使您将字段声明为INTEGER,您仍然可以存储浮点数,文本或甚至斑点。 “INTEGER”声明为该字段提供了将数据存储为整数的优先选择,但不会将其限制为整数。它仍然是一个可变宽度的列/记录。 (这甚至忽略了INTEGER在SQLite中不固定大小的细节......) – 2010-12-14 14:02:43