非常教程

Sqlite参考手册

其他 | Miscellaneous

SQLite Database Speed Comparison

Database Speed Comparison

注意:这个文件非常古老。它描述了SQLite,MySQL和PostgreSQL的古老版本之间的速度比较。

这里的数字变得毫无意义。此页面仅作为历史文物保留。

Executive Summary

运行一系列测试来测量SQLite 2.7.6,PostgreSQL 7.1.3和MySQL 3.23.41的相对性能。以下是从这些实验中得出的一般结论:

  • 对于大多数常见操作,SQLite 2.7.6比RedHat 7.2上的默认PostgreSQL 7.1.3安装速度快得多(有时高达10或20倍)。
  • 对于大多数常见操作,SQLite 2.7.6通常比MySQL 3.23.41更快(有时是速度的两倍)。
  • SQLite不像其他数据库那样快速地执行CREATE INDEX或DROP TABLE。但这并不是一个问题,因为这些并不常见。
  • 如果将多个操作组合到一个事务中,SQLite的效果最佳。

这里给出的结果有以下警告:

  • 这些测试并未尝试测量涉及多个连接和子查询的复杂查询的多用户性能或优化。
  • 这些测试是在一个相对较小的(大约14兆字节)数据库上。他们并没有衡量数据库引擎如何适应更大的问题。

Test Environment

用于这些测试的平台是具有1GB或内存和IDE磁盘驱动器的1.6GHz Athlon。操作系统是带有库存内核的RedHat Linux 7.2。

所使用的PostgreSQL和MySQL服务器默认在RedHat 7.2上交付。(PostgreSQL版本7.1.3和MySQL版本3.23.41。)没有努力调整这些引擎。特别注意RedHat 7.2上的默认MySQL配置不支持事务。不必支持事务处理就可以给MySQL带来很大的速度优势,但SQLite仍然能够在大多数测试中保持自己的地位。

我被告知RedHat 7.3中默认的PostgreSQL配置不必要的保守(它可以在8MB内存的机器上运行),并且通过一些知识丰富的配置调整,PostgreSQL可以运行得更快。马特警长报告说,他已经调整了他的PostgreSQL安装并重新运行下面显示的测试。他的结果显示PostgreSQL和MySQL的运行速度大致相同。对于Matt的结果,请访问

http://www.sergeant.org/sqlite_vs_pgsync.html

SQLite的测试与它在网站上显示的配置相同。它使用-O6优化和-DNDEBUG = 1编译,禁用SQLite代码中的许多“assert()”语句。-DNDEBUG = 1编译器选项大致加倍SQLite的速度。

所有的测试都是在另一台静止的机器上进行的。一个简单的Tcl脚本被用来生成和运行所有的测试。这个Tcl脚本的副本可以在文件tools / speedtest.tcl的SQLite源代码树中找到。

在所有测试中报告的时间表示以秒为单位的挂钟时间。SQLite报告了两个单独的时间值。第一个值是SQLite在默认配置下打开全磁盘同步。打开同步后,SQLite执行一个fsync()系统调用(或等价)来确定关键数据实际上已写入磁盘驱动器表面。如果在数据库更新过程中操作系统崩溃或计算机意外关闭,则同步对于确保数据库的完整性是必要的。SQLite的第二次报告是关闭同步的时间。关闭同步功能后,SQLite有时会快得多,但操作系统崩溃或意外的电源故障可能会损坏数据库。一般来说,同步SQLite时间用于与PostgreSQL(也是同步的)进行比较,异步SQLite时间用于与异步MySQL引擎进行比较。

Test 1: 1000 INSERTs

CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100)); INSERT INTO t1 VALUES(1,13153,'thirteen thousand one hundred fifty three'); INSERT INTO t1 VALUES(2,75560,'seventy five thousand five hundred sixty'); ... 省略了995行

INSERT INTO t1 VALUES(998,66289,'sixty six thousand two hundred eighty nine'); INSERT INTO t1 VALUES(999,24322,'twenty four thousand three hundred twenty two'); INSERT INTO t1 VALUES(1000,94142,'ninety four thousand one hundred forty two');

PostgreSQL:

4.373

MySQL:

0.114

SQLite 2.7.6:

13.061

SQLite 2.7.6 (nosync):

0.223

因为它没有一个中央服务器来协调访问,所以SQLite必须关闭并重新打开数据库文件,从而使每个事务的缓存失效。在此测试中,每条SQL语句都是一个单独的事务,因此必须打开和关闭数据库文件,并且缓存必须刷新1000次。尽管如此,SQLite的异步版本仍然和MySQL一样快。但是,注意同步版本的速度要慢很多。SQLite 在每次同步事务之后调用fsync(),以确保所有数据在继续之前都安全地存储在磁盘表面上。在同步测试的13秒钟内,SQLite处于空闲状态,等待磁盘I / O完成。

Test 2: 25000 INSERTs in a transaction

BEGIN; CREATE TABLE t2(a INTEGER, b INTEGER, c VARCHAR(100)); INSERT INTO t2 VALUES(1,59672,'fifty nine thousand six hundred seventy two'); ... 省略了24997行 INSERT INTO t2 VALUES(24999,89569,'eighty nine thousand five hundred sixty nine'); INSERT INTO t2 VALUES(25000,94666,'ninety four thousand six hundred sixty six'); COMMIT;

PostgreSQL:

4.900

MySQL:

2.184

SQLite 2.7.6:

0.914

SQLite 2.7.6 (nosync):

0.757

当所有INSERT被放入事务中时,SQLite不再需要关闭并重新打开数据库,或者在每个语句之间使其缓存失效。它也不需要做任何fsync()直到最后。当以这种方式解决问题时,SQLite比PostgreSQL和MySQL要快得多。

Test 3: 25000 INSERTs into an indexed table

BEGIN; CREATE TABLE t3(a INTEGER, b INTEGER, c VARCHAR(100)); CREATE INDEX i3 ON t3(c); ... 省略了24998行 INSERT INTO t3 VALUES(24999,88509,'eighty eight thousand five hundred nine'); INSERT INTO t3 VALUES(25000,84791,'eighty four thousand seven hundred ninety one'); COMMIT;

PostgreSQL:

8.175

MySQL:

3.197

SQLite 2.7.6:

1.555

SQLite 2.7.6 (nosync):

1.402

有报道说SQLite在索引表上的表现不佳。最近增加了这个测试来反驳这些谣言。确实,SQLite创建新索引条目的速度并不像其他引擎那样快(参见下面的测试6),但其总体速度仍然更好。

Test 4: 100 SELECTs without an index

BEGIN; SELECT count(*), avg(b) FROM t2 WHERE b>=0 AND b<1000; SELECT count(*), avg(b) FROM t2 WHERE b>=100 AND b<1100; ... 省略了96 行 SELECT count(*), avg(b) FROM t2 WHERE b>=9800 AND b<10800; SELECT count(*), avg(b) FROM t2 WHERE b>=9900 AND b<10900; COMMIT;

PostgreSQL:

3.629

MySQL:

2.760

SQLite 2.7.6:

2.494

SQLite 2.7.6 (nosync):

2.526

此测试在没有索引的25000条目表上执行100个查询,因此需要全表扫描。在此测试中,以前的SQLite版本比PostgreSQL和MySQL要慢,但最近的性能增强已经提高了它的速度,因此它现在是该组中速度最快的。

Test 5: 100 SELECTs on a string comparison

BEGIN; SELECT count(*), avg(b) FROM t2 WHERE c LIKE '%one%'; SELECT count(*), avg(b) FROM t2 WHERE c LIKE '%two%'; ... 省略了96行 SELECT count(*), avg(b) FROM t2 WHERE c LIKE '%ninety nine%'; SELECT count(*), avg(b) FROM t2 WHERE c LIKE '%one hundred%'; COMMIT;

PostgreSQL:

13.409

MySQL:

4.640

SQLite 2.7.6:

3.362

SQLite 2.7.6 (nosync):

3.372

该测试仍然执行100次全表扫描,但它使用字符串比较而不是数字比较。SQLite的速度比PostgreSQL快三倍,比MySQL快大约30%。

Test 6: Creating an index

CREATE INDEX i2a ON t2(a); CREATE INDEX i2b ON t2(b);

PostgreSQL:

0.381

MySQL:

0.318

SQLite 2.7.6:

0.777

SQLite 2.7.6 (nosync):

0.659

SQLite在创建新索引时速度较慢。这不是一个很大的问题(因为新的索引不是经常创建的),但它正在进行中。希望未来版本的SQLite在这里可以做得更好。

Test 7: 5000 SELECTs with an index

SELECT count(*), avg(b) FROM t2 WHERE b>=0 AND b<100; SELECT count(*), avg(b) FROM t2 WHERE b>=100 AND b<200; SELECT count(*), avg(b) FROM t2 WHERE b>=200 AND b<300; ... 省略了4994行 SELECT count(*), avg(b) FROM t2 WHERE b>=499700 AND b<499800; SELECT count(*), avg(b) FROM t2 WHERE b>=499800 AND b<499900; SELECT count(*), avg(b) FROM t2 WHERE b>=499900 AND b<500000;

PostgreSQL:

4.614

MySQL:

1.270

SQLite 2.7.6:

1.121

SQLite 2.7.6 (nosync):

1.162

所有三个数据库引擎在运行索引时都会运行得更快。但SQLite仍然是最快的。

Test 8: 1000 UPDATEs without an index

BEGIN; UPDATE t1 SET b=b*2 WHERE a>=0 AND a<10; UPDATE t1 SET b=b*2 WHERE a>=10 AND a<20; ... 省略了996行 UPDATE t1 SET b=b*2 WHERE a>=9980 AND a<9990; UPDATE t1 SET b=b*2 WHERE a>=9990 AND a<10000; COMMIT;

PostgreSQL:

1.739

MySQL:

8.410

SQLite 2.7.6:

0.637

SQLite 2.7.6 (nosync):

0.638

对于这个特定的UPDATE测试,MySQL一直比PostgreSQL和SQLite慢五到十倍。我不知道为什么。MySQL通常是一个非常快速的引擎。也许这个问题已经在更高版本的MySQL中解决了。

Test 9: 25000 UPDATEs with an index

BEGIN; UPDATE t2 SET b=468026 WHERE a=1; UPDATE t2 SET b=121928 WHERE a=2; ... 省略了24996 行 UPDATE t2 SET b=35065 WHERE a=24999; UPDATE t2 SET b=347393 WHERE a=25000; COMMIT;

PostgreSQL:

18.797

MySQL:

8.134

SQLite 2.7.6:

3.520

SQLite 2.7.6 (nosync):

3.104

就在最近的2.7.0版本中,SQLite的运行速度与MySQL的测试速度大致相同。但是最近对SQLite的优化​​比UPDATE的速度提高了一倍多。

Test 10: 25000 text UPDATEs with an index

BEGIN; UPDATE t2 SET c='one hundred forty eight thousand three hundred eighty two' WHERE a=1; UPDATE t2 SET c='three hundred sixty six thousand five hundred two' WHERE a=2; ... 省略了24996行 UPDATE t2 SET c='three hundred eighty three thousand ninety nine' WHERE a=24999; UPDATE t2 SET c='two hundred fifty six thousand eight hundred thirty' WHERE a=25000; COMMIT;

PostgreSQL:

48.133

MySQL:

6.982

SQLite 2.7.6:

2.408

SQLite 2.7.6 (nosync):

1.725

再次,SQLite 2.7.0版本的运行速度与MySQL相同。但是现在2.7.6版本的速度比MySQL快两倍,比PostgreSQL快了二十多倍。

公平对待PostgreSQL,它开始在这个测试中颠簸。知识渊博的管理员可以通过稍微调整和调整服务器来让PostgreSQL在这里运行得更快。

Test 11: INSERTs from a SELECT

BEGIN; INSERT INTO t1 SELECT b,a,c FROM t2; INSERT INTO t2 SELECT b,a,c FROM t1; COMMIT;

PostgreSQL:

61.364

MySQL:

1.537

SQLite 2.7.6:

2.787

SQLite 2.7.6 (nosync):

1.599

在这个测试中,异步SQLite只比MySQL更慢。(MySQL似乎特别擅长INSERT ... SELECT语句。)PostgreSQL引擎依然在颠簸 - 它所使用的61秒中的大部分都花在等待磁盘I / O上。

Test 12: DELETE without an index

DELETE FROM t2 WHERE c LIKE '%fifty%';

PostgreSQL:

1.509

MySQL:

0.975

SQLite 2.7.6:

4.004

SQLite 2.7.6 (nosync):

0.560

SQLite的同步版本是该测试中组最慢的,但异步版本是最快的。不同的是执行fsync()所需的额外时间。

Test 13: DELETE with an index

DELETE FROM t2 WHERE a>10 AND a<20000;

PostgreSQL:

1.316

MySQL:

2.262

SQLite 2.7.6:

2.068

SQLite 2.7.6 (nosync):

0.752

这个测试很重要,因为它是PostgreSQL比MySQL更快的少数几个之一。然而,异步SQLite比其他两个更快。

Test 14: A big INSERT after a big DELETE

INSERT INTO t2 SELECT * FROM t1;

PostgreSQL:

13.168

MySQL:

1.815

SQLite 2.7.6:

3.210

SQLite 2.7.6 (nosync):

1.485

一些旧版本的SQLite(2.4.0版之前)会在一系列删除操作后面显示新的INSERT后显示性能下降。正如本测试所示,问题现在已经解决。

Test 15: A big DELETE followed by many small INSERTs

BEGIN; DELETE FROM t1; INSERT INTO t1 VALUES(1,10719,'ten thousand seven hundred nineteen'); ... 省略了11997 行 INSERT INTO t1 VALUES(11999,72836,'seventy two thousand eight hundred thirty six'); INSERT INTO t1 VALUES(12000,64231,'sixty four thousand two hundred thirty one'); COMMIT;

PostgreSQL:

4.556

MySQL:

1.704

SQLite 2.7.6:

0.618

SQLite 2.7.6 (nosync):

0.406

SQLite非常擅长在事务中执行INSERT,这可能解释了为什么在此测试中它比其他数据库快得多。

Test 16: DROP TABLE

DROP TABLE t1; DROP TABLE t2; DROP TABLE t3;

PostgreSQL:

0.135

MySQL:

0.015

SQLite 2.7.6:

0.939

SQLite 2.7.6 (nosync):

0.254

当涉及到删除表时,SQLite比其他数据库要慢。这可能是因为当SQLite删除一个表时,它必须通过并擦除数据库文件中与该表有关的记录。另一方面,MySQL和PostgreSQL使用单独的文件来表示每个表,以便他们可以简单地通过删除文件来删除表,这会更快。

另一方面,删除表不是一个非常常见的操作,所以如果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.Partial Indexes
37.Pointer Passing Interfaces
38.Powersafe Overwrite
39.Release History Of SQLite
40.Result and Error Codes
41.Row Values
42.Rowid Tables
43.Run-Time Loadable Extensions
44.SQL Features That SQLite Does Not Implement
45.sqldiff.exe: Database Difference Utility
46.SQLite As An Application File Format
47.SQLite Autoincrement
48.SQLite Backup API
49.SQLite Changes From Version 3.4.2 To 3.5.0
50.SQLite Changes From Version 3.5.9 To 3.6.0
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