关于SQLite3的DBD :: SQLite我会将任何时间保存在仅选择一次的INDEX上吗?
如果我打算只查询一次SELECT。
Should I CREATE a INDEX first and then query the SELECT
or
just query the SELECT without an INDEX,
which is faster ?
如果需要指定,col。在索引上是undef或1的INTEGER,就是这两种可能性。
关于SQLite3的DBD :: SQLite我会将任何时间保存在仅选择一次的INDEX上吗?
如果我打算只查询一次SELECT。
Should I CREATE a INDEX first and then query the SELECT
or
just query the SELECT without an INDEX,
which is faster ?
如果需要指定,col。在索引上是undef或1的INTEGER,就是这两种可能性。
构建索引需要的时间比仅执行表扫描要花费的时间更长。因此,如果您的单个查询 - 只运行一次 - 只是表扫描,则添加索引将会变慢。
但是,如果您的单个查询不只是表扫描,则添加索引可能会更快。例如,如果没有索引,数据库可能会执行多次表扫描的连接,每个连接的行一次。那么索引可能会更快。
我会说要对它进行基准测试,但对于一次性查询而言,这听起来很愚蠢,您只会运行一次。
如果你考虑设置和索引一个只有两个可能值的列,那么这是不值得的,因为索引几乎没有什么改进。索引对于具有高度唯一性并经常查询特定值或范围的列很有用。在其他硬指标使插入和更新慢,所以在这种情况下,你应该跳过它。
对于只有两个值的列,索引可能值得。例如,也许你有一个包含大量行的表,并且布尔标志“这是否需要处理?”。假设大多数事情不需要处理,那么索引可能会大大加快“查找需要处理的东西”的查询。一般来说,指数很好地发现了罕见的价值,无论该集合的整体基数如何。 (非常高的基数是一种特殊情况,其中* all *值很少) – derobert 2009-08-21 06:28:05
所以如果我想选择一个列。多次(约100 k)两种可能性,我应该建立一个指数? – Galaxy 2009-08-21 06:28:58
......罕见的定义为小于1-10%,这取决于许多因素,例如随机访问表的花费与顺序访问的花费有多大。 – derobert 2009-08-21 06:29:57
由于没有INDEX,SELECT将执行表扫描,使用新的INDEX将一次将数据库索引保存为较慢。 – Galaxy 2009-08-21 06:26:38
表扫描通常是O(n);索引通常是树,因此构建索引可能不会比O(n)+ O(n * log(n))[n =行数]更快。 – derobert 2009-08-21 06:45:26