SQLite扫描表性能

时间:2013-01-23 12:03:36

标签: sql performance sqlite

我的表格包含以下字段:

  1. 日期(整数)
  2. 州(整数)
  3. ProductId(整数)
  4. ProductName(整数)
  5. 描述(文字)(最大文字长度 3000个字符)
  6. 将有超过800万行。我需要决定是否应该将产品描述放在另一个表中。我的主要目标是让这个陈述非常快:

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

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

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

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

    编辑:尝试在一个表中全部使用它的唯一原因是我想在数百个项目的一个事务中执行INSERT和UPDATE。可以在同一个事务中插入相同的项目并稍后更新,因此我无法知道每个项目的最后一个插入ID。

2 个答案:

答案 0 :(得分:1)

  1. 当您使用该查询并且Date列上没有索引时,SQLite将读取表中的所有记录,并使用临时表对结果进行排序。
  2. 当您在Date列上有索引时,SQLite将查找索引中的最后100条记录,然后从表中读取这些记录的所有数据。
  3. 如果您有一个covering index,即一个包含四列DateStateProductIdProductName的索引,SQLite将会阅读索引的最后100个条目。
  4. 每当SQLite从数据库文件中读取数据时,它不会读取值或记录,而是读取整个页面(通常为1 KB或4 KB)。

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

    案例2将比案例1快得多;案例3会更快,但可能还不够明显。

答案 1 :(得分:0)

我建议依靠良好的旧database normalization规则,在这种情况下具体为1NF。如果将重复该描述(对于ProductName也是如此),则存在数据库设计问题,并且它在SQLite或其他内容与它几乎没有关系。注意,CL对他的索引是正确的,正确的索引仍然很重要。

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