1

我的表有以下字段:

  1. 日期(整数)
  2. 状态(整数)
  3. 产品 ID(整数)
  4. 产品名称(整数)
  5. 说明(文字)(文字最长 3000 个字符)

将有超过 800 万行。我需要决定是否应该将产品描述放在另一个表中。我的主要目标是让这个声明非常快:

SELECT Date,State,ProductId,ProductName FROM tablename ORDER BY DATE desc LIMIT 100

SQL 结果将不会获取上述语句中的 Description 字段值。只有在应用程序中选择了行(新查询)时,用户才会看到描述。

我真的很想在同一个表中有产品描述,但我不确定 SQLite 如何扫描行。如果日期值不匹配,我会假设 SQLite 可以快速跳到下一行。或者它可能需要扫描行的所有字段,直到它到达描述字段值的末尾才能知道该行已经结束?如果需要扫描所有字段才能到达下一行,Description 字段中 3000 个字符的值会大大降低速度吗?

编辑:不应使用索引,因为插入速度很重要。

编辑:尝试将所有内容都放在一个表中的唯一原因是我想在一个包含数百个项目的事务中执行 INSERT 和 UPDATE。可以在同一个事务中插入同一个项目并稍后更新,所以我不知道每个项目的最后一个插入 ID。

4

2 回答 2

1
  1. 当您使用该查询并且在列上没有索引时Date,SQLite 将从表中读取所有记录,并使用临时表对结果进行排序。
  2. 当你在列上有索引时Date,SQLite 会在索引中查找最后 100 条记录,然后从表中读取这些记录的所有数据。
  3. 当您有一个覆盖索引时,即一个包含四列Date、、、和的索引时State,SQLite 将只读取索引中的最后 100 个条目。ProductIdProductName

每当 SQLite 从数据库文件中读取时,它不会读取值或记录,而是读取整个页面(通常为 1 KB 或 4 KB)。

在情况 1 中,SQLite 将读取表的所有页面。
在情况 2 中,SQLite 将读取索引的最后一页(因为 100 个日期将适合一页)和表的 100 页(每条记录一个,假设这些记录中没有两条恰好在同一页中)页)。
在情况 3 中,SQLite 将读取索引的最后几页。

案例 2 会比案例 1 快得多;案例 3 会更快,但可能不足以引起注意。

于 2013-01-23T12:39:17.897 回答
0

我建议依靠良好的旧数据库规范化规则,在这种情况下特别是1NF。如果要重复该描述(ProductName 也是如此),那么您有一个数据库设计问题,并且它在 SQLite 或其他中与它几乎没有关系。请注意,CL 的索引是正确的,正确的索引仍然很重要。

检查您的模型,为产品制作一个表格,为库存制作另一个表格。

于 2013-01-23T12:50:54.030 回答