SQLite存储类和检索效​​率

时间:2017-04-03 11:30:30

标签: sql sqlite

假设我有一个表,这是一个参考表(该表仅供参考,未更新)。

例如,表架构:

CREATE TABLE countries(
               zip_code INTEGER PRIMARY KEY,
               name TEXT)

我想提高数据的检索速度。现在,我在index列上使用了name,但我希望更进一步......

更改表架构:

CREATE TABLE countries(
                   zip_code INT PRIMARY KEY,
                   name CHAR(200))

重新定义我修改了列的数据类型,以便为每列指定固定大小,因此整行的大小固定

这是正确的假设吗?认为固定大小的行可以比SQLite DBMS 中的动态大小行更快地检索。

我从其他DBMS(MySQL)中获得灵感,它比动态大小行更快地检索静态大小行

1 个答案:

答案 0 :(得分:3)

我正在修复这个与SQLite相关的答案。它被接受了,所以我不能删除它。

我不认为为每个名称存储200个字节会加快查询速度。在大多数数据库中,它所做的只是将您存储的数据量相乘 - 因为名称较短。在SQLite中,它是一个无操作。 SQLite将所有字符串存储为文本;它没有像其他数据库一样用空格填充值。

我并不熟悉SQLite的内部。但数据库(包括SQLite)将记录存储在数据页上。这些由缓存机制管理。索引通过它所在的页面识别记录。读入整个数据页。

在大多数数据库中,将列声明为name(200)可能会浪费大量空间。它会增加记录的大小,并具有以下效果:

  • 较少的记录可以存储在一个页面上。
  • 后续检索不太可能在缓存中找到记录页面。
  • 阅读整个表可能会占用更多的内存空间。
  • 读取行需要读取和处理更多字节。

在SQLite中,这都不适用,因为SQLite只是忽略了长度,并且没有用空格填充值。

在大多数数据库中,您想要做的并不是一个好主意,它在SQLite中没有任何效果。我建议避免这种方法。指数应该足够了。