非常教程

Sqlite参考手册

其他 | Miscellaneous

Partial Indexes

1.介绍

2.创建部分索引

2.1.独特的部分索引

3.使用部分索引查询

4.支持的版本

部分索引是表格行的子集上的索引。

在普通索引中,表中每一行的索引中只有一个条目。在部分索引中,表中只有一部分行具有相应的索引条目。例如,部分索引可能会忽略被索引的列为NULL的条目。如果明智地使用,部分索引可能导致较小的数据库文件,并改善查询和写入性能。

通过将WHERE子句添加到普通的CREATE INDEX语句的末尾来创建部分索引。

create-index-stmt: hide

Partial Indexes

expr: show

Partial Indexes

literal-value: show

Partial Indexes

raise-function: show

Partial Indexes

select-stmt: show

Partial Indexes

common-table-expression: show

Partial Indexes

compound-operator: show

Partial Indexes

join-clause: show

Partial Indexes

join-constraint: show

Partial Indexes

join-operator: show

Partial Indexes

ordering-term: show

Partial Indexes

result-column: show

Partial Indexes

table-or-subquery: show

Partial Indexes

type-name: show

Partial Indexes

signed-number: show

Partial Indexes

indexed-column: show

Partial Indexes

包含最后WHERE子句的任何索引都被认为是部分索引。忽略WHERE子句的索引(或由CREATE TABLE语句内部的UNIQUE或PRIMARY KEY约束创建的索引)是普通的完整索引。

WHERE子句后面的表达式可能包含操作符,文字值和索引表中的列名称。WHERE子句可能包含子查询,对其他表的引用,非确定性函数或绑定参数。

索引中只包含WHERE子句评估为true的表的行。如果WHERE子句表达式对表的某些行计算为NULL或false,那么这些行将从索引中省略。

部分索引的WHERE子句中引用的列可以是表中的任何列,而不仅仅是恰好索引的列。然而,部分索引的WHERE子句表达式对被索引的列是一个简单表达式是非常常见的。以下是一个典型的例子:

CREATE INDEX po_parent ON purchaseorder(parent_po) WHERE parent_po IS NOT NULL;

在上面的示例中,如果大多数采购订单没有“父”采购订单,那么大多数parent_po值将为NULL。这意味着只有purchaseorder表中的一小部分行会被索引。因此,指数将占用更少的空间。原始采购订单表的更改将运行得更快,因为只需要为parent_po不为NULL的那些例外行更新po_parent索引。但是索引对于查询仍然有用。特别是,如果想知道特定采购订单“1”的所有“子女”,该查询将是:

SELECT po_num FROM purchaseorder WHERE parent_po=?1;

上面的查询将使用po_parent索引来帮助查找答案,因为po_parent索引包含所有感兴趣的行的条目。请注意,由于po_parent小于完整索引,查询运行速度可能会更快。

2.1. Unique Partial Indexes

部分索引定义可能包括UNIQUE关键字。如果是这样,那么SQLite要求索引中的每个条目都是唯一的。这提供了一种机制来强制跨表中某些行的子集进行唯一性。

例如,假设你有一个大型组织成员的数据库,每个人被分配到一个特定的“团队”。每个团队都有一个“领导者”,他也是该团队的成员。表格可能看起来像这样:

CREATE TABLE person(
  person_id       INTEGER PRIMARY KEY,
  team_id         INTEGER REFERENCES team,
  is_team_leader  BOOLEAN,
  -- other fields elided
);

team_id字段不能是唯一的,因为通常在同一个团队中有多个人。由于每个团队通常有多个非领导者,因此不能将team_id和is_team_leader组合在一起。为每个团队实施一名领导者的解决方案是在team_id上创建一个唯一的索引,但仅限于那些is_team_leader为true的条目:

CREATE UNIQUE INDEX team_leader ON person(team_id) WHERE is_team_leader;

巧合的是,相同的索引对于查找特定团队的团队领导者非常有用:

SELECT person_id FROM person WHERE is_team_leader AND team_id=?1;

假设X是部分索引的WHERE子句中的表达式,并且让W是使用索引表的查询的WHERE子句。然后,查询被允许使用部分索引,如果W⇒X,其中⇒运算符(通常发音为“隐含”)是相当于“X或不W”的逻辑运算符。因此,确定部分索引是否可用于特定查询中减少了在一阶逻辑中证明定理。

SQLite没有一个复杂的定理证明器来确定W⇒X。相反,SQLite使用两个简单的规则来找到W⇒X为真的常见情况,并假定所有其他情况都是错误的。SQLite使用的规则如下:

  • 如果W是AND连接项并且X是OR连接项并且W的任何项出现为X的项,那么部分索引是可用的。 例如,让索引为CREATE INDEX ex1 ON tab1(a,b)WHERE a = 5或b = 6; 让查询为:SELECT * FROM tab1 WHERE b = 6 AND a = 7; - 使用部分索引然后索引可用于查询,因为“b = 6”项出现在索引定义和查询中。记住:索引中的术语应该是OR连接的,查询中的术语应该是AND连接的。 W和X中的术语必须完全匹配。SQLite不会做代数,试图让它们看起来一样。术语“b = 6”不匹配“b = 3 + 3”或“b-6 = 0”或“b BETWEEN 6和6”。只要“b = 6”在索引上并且“6 = b”与“6 = b”匹配,“b = 6” 在查询中。如果索引中出现“6 = b”形式的术语,它将永远不会匹配任何内容。
  • 如果X中的项的形式为“z IS NOT NULL”,并且如果W中的项是除“IS”之外的“z”上的比较运算符,则这些项匹配。

示例:让索引成为

CREATE INDEX ex2 ON tab2(b,c) WHERE c IS NOT NULL;

然后,在列“c”上使用运算符=,<,>,<=,> =,<>,IN,LIKE或GLOB的任何查询都可用于部分索引,因为那些比较运算符只有在“c”不是NULL。所以下面的查询可以使用部分索引:

SELECT * FROM tab2 WHERE b = 456 AND c <> 0; - 使用部分索引

但是下一个查询不能使用部分索引:

SELECT * FROM tab2 WHERE b = 456; - 不能使用部分索引

后者查询不能使用部分索引,因为表中可能有b = 456且c为NULL的行。但是这些行不在部分索引中。

这两条规则描述了SQLite的查询规划器如何在撰写本文时使用(2013-08-01)。上述规则将永远受到尊重。但是,未来版本的SQLite可能包含一个更好的定理证明器,它可以找到W⇒X为真的其他情况,因此可能会发现部分索引有用的更多实例。

自3.8.0版(2013-08-26)开始,SQLite支持部分索引。

包含部分索引的数据库文件在3.8.0之前版本的SQLite中不可读写。但是,由SQLite 3.8.0创建的数据库文件仍然可以被先前版本读写,只要其架构不包含部分索引。只有通过在部分索引上运行DROP INDEX,才能使旧版SQLite无法读取的数据库变得可读。

 SQLite is in the Public Domain.

其他 | Miscellaneous相关

1.35% Faster Than The Filesystem
2.8+3 Filenames
3.An Asynchronous I/O Module For SQLite
4.Appropriate Uses For SQLite
5.Architecture of SQLite
6.Atomic Commit In SQLite
7.Automatic Undo/Redo With SQLite
8.Benefits of SQLite As A File Format
9.Change in Default Page Size in SQLite Version 3.12.0
10.Clustered Indexes and the WITHOUT ROWID Optimization
11.Compile-time Options
12.Constraint Conflict Resolution in SQLite
13.Custom Builds Of SQLite
14.Deterministic SQL Functions
15.Distinctive Features Of SQLite
16.EXPLAIN QUERY PLAN
17.Features Of SQLite
18.File Format Changes in SQLite
19.Full-Featured SQL
20.High Reliability
21.Hints for Debugging SQLite
22.How SQLite Is Tested
23.How To Compile SQLite
24.How To Download Canonical SQLite Source Code
25.Imposter Tables
26.In-Memory Databases
27.Indexes On Expressions
28.Internal Versus External BLOBs
29.Isolation In SQLite
30.Long Term Support
31.Maintaining Private Branches Of SQLite
32.Many Small Queries Are Efficient In SQLite
33.Measuring and Reducing CPU Usage in SQLite
34.Memory-Mapped I/O
35.NULL Handling in SQLite
36.Pointer Passing Interfaces
37.Powersafe Overwrite
38.Release History Of SQLite
39.Result and Error Codes
40.Row Values
41.Rowid Tables
42.Run-Time Loadable Extensions
43.SQL Features That SQLite Does Not Implement
44.sqldiff.exe: Database Difference Utility
45.SQLite As An Application File Format
46.SQLite Autoincrement
47.SQLite Backup API
48.SQLite Changes From Version 3.4.2 To 3.5.0
49.SQLite Changes From Version 3.5.9 To 3.6.0
50.SQLite Database Speed Comparison
51.SQLite File IO Specification
52.SQLite Frequently Asked Questions
53.SQLite In 5 Minutes Or Less
54.SQLite is a Self Contained System
55.SQLite Is Serverless
56.SQLite Is Transactional
57.SQLite Library Footprint
58.SQLite Shared-Cache Mode
59.SQLite Unlock-Notify API
60.SQLite Version 3 Overview
61.SQLite: Single File Database
62.Temporary Files Used By SQLite
63.TH3
64.The COMPLETION() Table-Valued Function
65.The CSV Virtual Table
66.The dbhash.exe Utility Program
67.The DBSTAT Virtual Table
68.The Error And Warning Log
69.The generate_series Table-Valued Function
70.The OS Backend (VFS) To SQLite
71.The Spellfix1 Virtual Table
72.The SQLite Amalgamation
73.The SQLite Bytecode Engine
74.The sqlite3_analyzer.exe Utility Program
75.The SQLITE_STMT Virtual Table
76.The UNION Virtual Table
77.The Virtual Database Engine of SQLite
78.Uniform Resource Identifiers
79.Using SQLite In Multi-Threaded Applications
80.Version Numbers in SQLite
81.What If OpenDocument Used SQLite?
82.Why Is SQLite Coded In C
83.Zero-Configuration
Sqlite

SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库管理系统来

主页 https://sqlite.org/
源码 https://www.sqlite.org/src/
发布版本 3.21.0

Sqlite目录

1.C界面 | C Interface
2.C Interface: Session Module
3.CLI
4.数据库文件表 | Database File Format
5.数据类 | Datatypes
6.动态内存分配 | Dynamic Memory Allocation
7.外键约束 | Foreign Key Constraints
8.全文索引 | Full-Text Search
9.损坏方式 | How To Corrupt
10.JSON
11.语言 | Language
12.局限性 | Limits
13.锁定和并发 | Locking and Concurrency
14.其他 | Miscellaneous
15.PRAGMA Statements
16.查询计划程序 | Query Planner
17.R*Tree Module
18.RBU Extension
19.语法图 | Syntax Diagrams
20.Tcl Interface
21.虚拟表机制 | Virtual Table Mechanism
22.预写日志 | Write-Ahead Logging
23.SQL 教程
24.SQL 简介
25.SQL 语法
26.SQL DELETE 语句
27.SQL UPDATE 语句
28.SQL NOT NULL 约束
29.SQL 约束
30.SQL CREATE TABLE 语句
31.SQL CREATE DATABASE 语句
32.SQL INSERT INTO SELECT 语句
33.SQL SELECT INTO 语句
34.SQL CREATE VIEW、REPLACE VIEW、 DROP VIEW 语句
35.SQL AUTO INCREMENT 字段
36.SQL ALTER TABLE 语句
37.SQL 撤销索引、表以及数据库
38.SQL CREATE INDEX 语句
39.SQL DEFAULT 约束
40.SQL CHECK 约束
41.SQL FOREIGN KEY 约束
42.SQL PRIMARY KEY 约束
43.SQL UNIQUE 约束
44.SQL 通用数据类型
45.SQL ISNULL()、NVL()、IFNULL() 和 COALESCE() 函数
46.SQL NULL 值 – IS NULL 和 IS NOT NULL
47.SQL Server 和 MySQL 中的 Date 函数
48.SQL MS Access、MySQL 和 SQL Server 数据类型
49.SQL 函数
50.SQL 总结
51.SQL 主机
52.SQL 快速参考
53.SQL ROUND() 函数
54.SQL Server GETDATE() 函数
55.MySQL DATE_FORMAT() 函数
56.MySQL DATEDIFF() 函数
57.MySQL DATE_SUB() 函数
58.MySQL DATE_ADD() 函数
59.MySQL EXTRACT() 函数
60.MySQL DATE() 函数
61.MySQL CURTIME() 函数
62.MySQL CURDATE() 函数
63.MySQL NOW() 函数
64.SQL Server CONVERT() 函数
65.SQL Server DATEDIFF() 函数
66.SQL Server DATEADD() 函数
67.SQL Server DATEPART() 函数
68.SQLite 命令
69.SQLite 安装
70.SQLite 简介
71.SQLite 运算符
72.SQLite Select 语句
73.SQLite 删除表
74.SQLite 创建表
75.SQLite Insert 语句
76.SQLite 分离数据库
77.SQLite 附加数据库
78.SQLite 创建数据库
79.SQLite 数据类型
80.SQLite 语法
81.SQLite Order By
82.SQLite Limit 子句
83.SQLite Glob 子句
84.SQLite Like 子句
85.SQLite Delete 语句
86.SQLite Update 语句
87.SQLite AND/OR 运算符
88.SQLite Where 子句
89.SQLite 表达式
90.SQLite Distinct 关键字
91.SQLite Having 子句
92.SQLite Group By
93.SQLite Join
94.SQLite 约束
95.SQLite PRAGMA
96.SQLite 事务
97.SQLite 视图
98.SQLite Truncate Table
99.SQLite Alter 命令
100.SQLite Indexed By