【问题标题】:SQLite - Create and index for every fieldSQLite - 为每个字段创建和索引
【发布时间】:2010-09-01 21:24:46
【问题描述】:

我正在创建一个应用程序,该应用程序将从 SQLite 数据库中获取数据并将其显示在表格中。

我希望在用户进行选择时实时更新表格(通过多个下拉框)。每次用户从下拉框中选择一个选项时,应用程序都必须创建一个新的 SELECT 查询,其中包含添加、删除或更改的新 WHERE 子句。该表格将显示查询结果,因为从下拉框中选择了一个项目。

我的问题是,为了使获取过程更快,我应该/我可以索引每个表中的每个字段吗?我不确定这是否可能。

我不需要担心 INSERT、ALTER 等性能问题,因为很少会添加新数据。

谢谢

【问题讨论】:

  • 我猜你的意思是列。我了解字段是由第 no 行与第 no 列的交集定义的

标签: sql sqlite


【解决方案1】:

我认为您应该首先看看 SELECT 查询的性能是否真的会成为问题。索引会占用大量空间(有时甚至超过实际数据),因此不要尝试过早优化(请记住,您可以随时添加索引而无需更改任何其他内容)。

如果您确实发现问题,您可以尝试在 WHERE 子句中使用的字段上添加索引,从查询次数最多的字段开始。

【讨论】:

    【解决方案2】:

    您想让每一列都可搜索吗?真的吗?而且没有索引查询太慢?哦,好吧,如果您是并且数据更改如您所说的那样罕见,请构建索引(假设它们是一种自然而然地索引的类型)。但是,空间成本会很高,一旦达到索引无法放入内存的大小(以及其他重要的东西,如程序和操作系统),那么您将使用磁盘而不是很多,反正一切都会慢下来。

    但在测量真实数据的问题之前不要进行优化。过早的优化是万恶之源。

    【讨论】:

      【解决方案3】:

      我的问题是,为了使 我应该/我可以更快地获取过程 索引每个表中的每个字段?我是 不确定这是否可能。

      是的,这是可能的。您是否应该取决于您有多少磁盘空间;索引可以是巨大的

      【讨论】:

        【解决方案4】:

        不对每个字段添加索引不会使其更快 - 系统一次只能使用一个索引。如果该列仅包含几个不同的值(例如客户的出生年份),那么使用索引的效率将低于读取表中的每条记录并丢弃不匹配的记录。 OTOH,如果用户按表的主键进行过滤,那么索引将非常非常有效。

        在每个字段组合上添加索引会使其更快 - 但那是 (N+1)!索引。这将需要大量存储空间并大大减慢任何 DML。

        最好的妥协是

        1. 默认需要一些过滤
        2. 构建与常用选择标准匹配的索引(包括“默认”过滤)
        3. 日志选择标准和查询时间以确定如何改进

        C.

        【讨论】:

        • 只有“2^N-1”个可能的字段组合。
        • 否 - 有 2 个字段,可能的索引是 (a)、(b)、(ab)、(ba)。与 3 (a), (b), (c), (ab), (ba), (ac), (bc), (ca), (cb), (abc), (bca), (cba), (出租车)。等等,实际上比 (N+1) 增长得更快!当然比 2^N-1 多很多。或者您是否建议有一个支持跳过扫描操作的 SQLite 版本?
        【解决方案5】:

        实现这一点的最佳方法是在表格加载时将所有数据拉下并填充表格。然后只需将过滤器添加到表列并让您的下拉列表联系过滤器,而不是每次都访问数据库。

        【讨论】:

          猜你喜欢
          • 2014-11-09
          • 2010-11-29
          • 2022-09-30
          • 2018-02-21
          • 2019-12-18
          • 1970-01-01
          • 2011-07-23
          • 1970-01-01
          • 2015-11-19
          相关资源
          最近更新 更多