PHPQ致力于分享PHP,做PHP中文资讯第一站点。我们关心的不仅仅是PHP!涵盖PHP教程、PHP安装、PHP下载、PHP源码、PHP论坛各个方面。

PhpQ.net - PHP资讯第一站点

匿名投稿 投稿指南 RSS订阅 PHP资讯

SQLite与其他数据库的速度比较(二)

这篇文档是一篇旧文档。它把老版的SQLite的速度和老版的MySQL和 PostgreSQL的速度进行了对比。读者被热诚地邀请贡献更先进的速度对比在SQLite Wiki. 这里的数字非常老,几乎没什么意义。在更新之前仍使用这篇文档只是为了证明SQLite不是停滞不前的。
测试2:在事务处理程序中的 25000 INSERTs
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 lines omitted
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;
SQLite执行结果数据:
PostgreSQL:   4.900
MySQL:   2.184
SQLite 2.7.6:   0.914
SQLite 2.7.6 (nosync):   0.757


当所有的INSERTs被放入一个事务处理程序时,SQLite不在需要关闭再打开数据库,或者使各个语句间的高速缓存器无效。在结束之前它也不用再执行fsync()s。当解决了这个问题后SQLite 比PostgreSQL和MySQL快很多


测试 3: 在编入索引表格中的25000 INSERTs
BEGIN;
CREATE TABLE t3(a INTEGER, b INTEGER, c VARCHAR(100));
CREATE INDEX i3 ON t3(c);
... 24998 lines omitted
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;
SQLite执行结果数据:
PostgreSQL:   8.175
MySQL:   3.197
SQLite 2.7.6:   1.555
SQLite 2.7.6 (nosync):   1.402


有报告说SQLite在编入索引的表格中表现的不是很好。这个测试证明事实不是这样的,虽然SQLite在创建索引登录时不是很快,但它整体的速度仍是比PostgreSQL和MySQL快。


测试 4:没有索引的 100 SELECTs
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 lines omitted
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;
SQLite执行结果数据:
PostgreSQL:   3.629
MySQL:   2.760
SQLite 2.7.6:   2.494
SQLite 2.7.6 (nosync):   2.526

这个测试是在一个没有索引的25000登录表格中进行100查询,所以需要浏览一个完整的表格。 SQLite之前的版本在这个测试上比PostgreSQL和MySQL慢,但最新版本的SQLite是比前两者都快的。


测试5: 在一个字符串比较上的100 SELECTs
BEGIN;
SELECT count(*), avg(b) FROM t2 WHERE c LIKE '%one%';
SELECT count(*), avg(b) FROM t2 WHERE c LIKE '%two%';
... 96 lines omitted
SELECT count(*), avg(b) FROM t2 WHERE c LIKE '%ninety nine%';
SELECT count(*), avg(b) FROM t2 WHERE c LIKE '%one hundred%';
COMMIT;
SQLite执行结果数据:
PostgreSQL:   13.409
MySQL:   4.640
SQLite 2.7.6:   3.362
SQLite 2.7.6 (nosync):   3.372
这个测试浏览 100 完整表格,但它使用字符串比较,而不是数字比较。This test still does 100 full table scans but it uses uses string comparisons instead of numerical comparisons. SQLite 比PostgreSQL快三倍,比MYSQL快30%。


Test 6: Creating an index
CREATE INDEX i2a ON t2(a);
CREATE INDEX i2b ON t2(b);
SQLite执行结果数据:
PostgreSQL:   0.381
MySQL:   0.318
SQLite 2.7.6:   0.777
SQLite 2.7.6 (nosync):   0.659
SQLite在创建新索引时是比较慢的,但这并不是什么大问题,因为创建新目录并不常用,希望SQLite之后的版本在这个问题上可以变得快些。


测试 7: 没有索引的5000 SELECTs
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 lines omitted
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;
SQLite执行结果数据:
PostgreSQL:   4.614
MySQL:   1.270
SQLite 2.7.6:   1.121
SQLite 2.7.6 (nosync):   1.162
当有索引的时候,所有这三个数据库都运行的非常快,但SQLite仍是最快的。

测试 8: 没有索引的1000 UPDATEs
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 lines omitted
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;
SQLite执行结果数据:
PostgreSQL:   1.739
MySQL:   8.410
SQLite 2.7.6:   0.637
SQLite 2.7.6 (nosync):   0.638
对于这个特别的UPDATE测试,MySQL 比PostgreSQL和SQLite慢五或十倍。我不知为什么。 MySQL通常情况下是个非常快的引擎。也许这个问题在之后的版本中被详细说明了。


参考文档
SQLite与其他数据库的速度比较
SQLite与其他数据库的速度比较(二)
SQLite与其他数据库的速度比较(三)
Tags:SQLite   数据库   比较   速度  
责任编辑:kimi
关于我们 - PHP资讯 - 投稿指南 - 文章归档 - PHP教程
- -